У меня есть такая хранимая процедура
CREATE OR REPLACE PROCEDURE schema_name.CHECKS
IS
tbl_name VARCHAR2 (50);
constraint_nm VARCHAR2 (100);
CURSOR cur_constraint
IS
SELECT DISTINCT table_name, constraint_name
FROM all_constraints
WHERE constraint_type = 'R'
AND STATUS = 'ENABLED'
AND R_OWNER = 'owner1'
AND r_constraint_name = 'constraint1';
BEGIN
DBMS_OUTPUT.put_line ('Constraint Name');
OPEN cur_constraint;
LOOP
FETCH cur_constraint
INTO tbl_name, constraint_nm;
EXIT WHEN cur_constraint%NOTFOUND;
DBMS_OUTPUT.put_line (constraint_nm||'~~'||tbl_name);
END LOOP;
close cur_constraint;
END CHECKS;
И я выполняю эту процедуру с помощью
set serveroutput on
BEGIN
schema_name.CHECKS ();
END;
И получаю вывод:
Procedure created.
Constraint Name
PL/SQL procedure successfully completed.
Этоне возвращает никакого результата, но в идеале он должен возвращать строку (запрос select, используемый для определения курсора, вернет строку).
Когда я выполняю приведенный выше код в виде блока PL / SQL, как этот
DECLARE
tbl_name VARCHAR2 (50);
constraint_nm VARCHAR2 (100);
CURSOR cur_constraint
IS
SELECT DISTINCT table_name, constraint_name
FROM all_constraints
WHERE constraint_type = 'R'
AND STATUS = 'ENABLED'
AND R_OWNER = 'owner1'
AND r_constraint_name = 'constraint1';
BEGIN
FOR i IN cur_constraint
LOOP
EXIT WHEN cur_constraint%NOTFOUND;
DBMS_OUTPUT.put_line (i.constraint_name||' is in '||i.table_name);
END LOOP;
END;
Он возвращает одну строку, как ожидалось.
Пожалуйста, помогите мне понять, почемуведет себя странно, когда логика та же, за исключением того, как я ее выполняю.