Вы не показали, что делает P_P1
, но из того, что вы показали, ваша P_P2
процедура может просто вызывать ее слишком рано;у вас есть вызов P_P1
, который использует v_str
в качестве параметра, но в этот момент он равен нулю - вы устанавливаете его после вызова, который его использует.
Это означает, что где-тов P_P1
вы, вероятно, в конечном итоге делаете эквивалент:
dbms_sql.parse(c, null, dbms_sql.native);
, который выдает ошибку, которую вы видите.Вы делаете то же самое с v_filename
, что, вероятно, вызовет другие проблемы.
Итак, для начала поменяйте местами строки, чтобы процедура называлась последней:
create or replace
PROCEDURE P_P2
IS
v_str varchar2(1000);
v_file_name varchar2(1000);
BEGIN
v_str := 'select * from H----)';
v_file_name := 'H_'||to_char(sysdate,'DD-MM-YYYY')||'.csv';
-- call this AFTER populating the variables
P_P1(v_str, 'EXPORT_CSV',v_file_name);
END;
/
ВыКонечно, могут возникнуть и другие проблемы - имя таблицы выглядит странно как из-за тире, так и из-за закрывающих скобок;но вы, возможно, просто странно скрыли настоящее имя.Вы, кажется, тоже изменили имена процедур (хотя и непоследовательно, поскольку ваш exec
, кажется, вызывает неправильный ...).