공간 메타데이터와 공간 인덱스가 있는 모든 테이블의 메모리 내 배열을 만들려고 합니다.
* 오류가 발생했습니다.
PLS-00306 잘못된 인수 개수
, 아래 코드 줄에서:**
v_idx_info_arr(v_array_counter) :=
idx_info_arr('THE_TABLE','THE_OWNER','THE_INDEX_NAME');
"index_info" 유형에 varchar2(100) 유형의 필드가 3개 있는 경우 인수 수가 잘못된 이유는 무엇입니까?
코드를 that^에서 로 변경할 계획 idx_info_arr(rec.index_name, rec.table_owner, rec.table_name);
이지만 테스트를 위해 하드 코딩된 문자열만 남겨두었습니다.
또한 문서 및 스택 오버플로 질문에서 함께 연결했기 때문에 PL/SQL에서 사용자 지정 유형 및 배열이 작동하는 방식에 대해서도 잘 모르겠습니다. 이러한 선언 및 사용에 대한 수정은 환영합니다.
DECLARE
TYPE index_info IS RECORD(
table_name varchar2(100),
table_owner varchar2(100),
index_name varchar2(100)
);
CURSOR all_geom_tables IS
SELECT gt.owner, gt.table_name, gt.column_name, gt.srid
FROM all_sdo_geom_metadata gt
WHERE SRID = 8311
ORDER BY TABLE_NAME;
type idx_info_arr is table of index_info;
array v_idx_info_arr := idx_info_arr();
v_array_counter integer := 0;
v_table_geom sdo_geometry;
v_spt_index varchar2(100);
v_view_count integer;
v_index_count integer;
BEGIN
-- Start Loop Through all tables in database
FOR db_table IN all_geom_tables LOOP
-- Loop through all tables which have a spatial index
FOR rec IN (select table_name, table_owner, index_name
from ALL_SDO_INDEX_INFO WHERE
TABLE_OWNER = db_table.owner
AND TABLE_NAME = db_table.table_name) LOOP
DBMS_OUTPUT.PUT_LINE('Index name is: ' || rec.index_name);
-- record the index here
v_idx_info_arr(v_array_counter) := idx_info_arr('THE_TABLE','THE_OWNER','THE_INDEX_NAME');
v_idx_info_arr.extend();
v_array_counter := v_array_counter + 1;
END LOOP;
END LOOP;
END;
Oracle 18c 미만 버전의 경우 모든 레코드 요소를 한 번에 할당할 수 없습니다. 개별적으로 할당해야 합니다. 또한 v_idx_info_arr.extend
요소를 지정하지 않고 초기화한 후에도 컬렉션의 크기는 여전히 0이므로 루프 전에 가 필요합니다.
Oracle 12.2 이하 버전용 코드
DECLARE
TYPE index_info IS RECORD ( table_name VARCHAR2(100),
table_owner VARCHAR2(100),
index_name VARCHAR2(100) );
TYPE idx_info_arr IS
TABLE OF index_info;
v_idx_info_arr idx_info_arr := idx_info_arr ();
v_array_counter INTEGER := 1;
BEGIN
v_idx_info_arr.extend;
FOR i IN 1..10 LOOP
v_idx_info_arr(v_array_counter).table_name := 'THE_TABLE';
v_idx_info_arr(v_array_counter).table_owner := 'THE_OWNER';
v_idx_info_arr(v_array_counter).index_name := 'THE_INDEX_NAME';
v_idx_info_arr.extend ();
v_array_counter := v_array_counter + 1;
END LOOP;
END;
/
Oracle 18c 는 그렇게 할 수 있는 Qualified 표현식 을 도입했습니다 .
v_idx_info_arr(v_array_counter) :=
index_info('THE_TABLE','THE_OWNER','THE_INDEX_NAME');
18c용 데모
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다