Я пытаюсь написать процедуру со следующими функциями. А именно, ищет записи из таблиц в схеме. В частности, это столбец typepkstring в этих таблицах. В то же время у меня есть таблица составных типов в той же схеме, в которой есть столбец pk. Столбец pk содержит все числовые идентификаторы из вышеупомянутого столбца typepkstring. И теперь проблема в том, что в typepkstring у нас есть дополнительные ключи, которых нет в столбце pk в составных типах tabel. И мне нужно найти схему и выписать ее вместе с именем таблицы, в которой они находятся.
На данный момент моя процедура выглядит следующим образом:
create or replace PROCEDURE SIEROT
(i_table_name VARCHAR2)
is
CURSOR c is
SELECT DISTINCT i_table_name.TYPEPKSTRING
FROM i_table_name
LEFT OUTER JOIN COMPOSEDTYPES
ON i_table_name.TYPEPKSTRING=COMPOSEDTYPES.PK
WHERE COMPOSEDTYPES.PK IS NULL;
TYPE c_list IS TABLE of PRODUCTS.TYPEPKSTRING%type INDEX BY binary_integer;
TYPEPK_list c_list;
counter integer :=0;
BEGIN
FOR n IN c LOOP
counter := counter +1;
TYPEPK_list(counter) := n.TYPEPKSTRING;
dbms_output.put_line('TABLE: '||i_table_name||'('||counter||'):'||TYPEPK_list(counter));
END LOOP;
END;
и звонят:
set serveroutput on
DECLARE
ind integer := 0;
BEGIN
FOR ind IN (select table_name from all_tab_columns where column_name='TYPEPKSTRING' AND table_name!='COMPOSEDTYPES')
LOOP
BEGIN
SIEROT(ind.table_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
null;
END;
END LOOP;
END;
это второй подход к проблеме, который я использовал, мне он показался проще. Второй, также не функциональный, был основан на курсорах, использующих тип массива.
Моя проблема:
вызов конечно работает нормально, но когда я компилирую ту же процедуру, я получаю следующую ошибку:
Procedure SIEROT compiled
LINE/COL ERROR
--------- -------------------------------------------------------------
5/7 PL/SQL: SQL Statement ignored
6/31 PL/SQL: ORA-00942: table or view does not exist
17/7 PL/SQL: Statement ignored
17/31 PLS-00364: loop index variable 'N' use is invalid
Errors: check compiler log
То же самое, что и для постоянно вводимых имен таблиц, где я поместил 2 записи, которые соответствуют условиям задачи, работает правильно:
SELECT DISTINCT TESTOWY.TYPEPKSTRING
FROM TESTOWY
LEFT OUTER JOIN COMPOSEDTYPES
ON TESTOWY.TYPEPKSTRING=COMPOSEDTYPES.PK
WHERE COMPOSEDTYPES.PK IS NULL;
и для select, введенного таким образом в процедуре, он дает ожидаемый эффект, но мне нужно параметризовать имя исходной таблицы, если она хочет выполнить поиск по всей всей схеме, а не только по конкретной. Только один из вышеупомянутых выборов будет достаточен для одного конкретного:
TABLE: TESTOWY(1):8790000000098
TABLE: TESTOWY(2):8790000000124
PL/SQL procedure successfully completed.
У меня действительно нет сил для этой процедуры. Напишите мне, как улучшить это, чтобы работать, но и выполнить свое мнение. Спасибо за любые подсказки или исправления;)