Значение переменной видит с кавычками, как убрать?
Данный код работает:
declare
--sql_stmt clob;
p_file_name varchar2(100);
TYPE c_crn IS TABLE OF VARCHAR2(1000);
l_crn_tab c_crn;
begin
p_file_name:='DCO_CRN_TEST.xlsx';
--sql_stmt:='select STRING_VAL bulk collect into l_crn_tab from TABLE( TABLEAU.as_read_xlsx.READ( TABLEAU.as_read_xlsx.file2blob(''EXRATE'','''||p_file_name||''') ) )';
select STRING_VAL bulk collect into l_crn_tab from TABLE( TABLEAU.as_read_xlsx.READ( TABLEAU.as_read_xlsx.file2blob('EXRATE',p_file_name) ) );
--EXECUTE IMMEDIATE stmt;
end;
А если его выполнять динамически, то не работает:
declare
sql_stmt clob;
p_file_name varchar2(100);
TYPE c_crn IS TABLE OF VARCHAR2(1000);
l_crn_tab c_crn;
begin
p_file_name:='DCO_CRN_TEST.xlsx';
sql_stmt:='select STRING_VAL bulk collect into l_crn_tab from TABLE( TABLEAU.as_read_xlsx.READ( TABLEAU.as_read_xlsx.file2blob(''EXRATE'','||p_file_name||')))';
--select STRING_VAL bulk collect into l_crn_tab from TABLE( TABLEAU.as_read_xlsx.READ( TABLEAU.as_read_xlsx.file2blob('EXRATE',p_file_name) ) );
EXECUTE IMMEDIATE sql_stmt;
end;
ОШИБКА : Error report -
ORA-00904: "DCO_CRN_TEST"."XLSX": недопустимый идентификатор
ORA-06512: на line 10
00904. 00000 - "%s: invalid identifier"
Как сделать, чтобы оператор lob.open увидел название файла DCO_CRN_TEST.XLSX?
sql_stmt:=q'[select STRING_VAL bulk collect into l_crn_tab from TABLE( TABLEAU.as_read_xlsx.READ( TABLEAU.as_read_xlsx.file2blob('EXRATE','||p_file_name||')))]';
ORA-03001: средство не реализовано
ORA-06512: на line 10
03001. 00000 - "unimplemented feature"
*Cause: This feature is not implemented.
Где ORA-06512 на этой строке:
dbms_lob.open( file_lob, dbms_lob.file_readonly );
Ответы (1 шт):
В динамическом запросе заначения надо передовать используя USING переменными связывания . А чтобы получить результат запроса, надо bulk collect into вынести из самого текста запроса, так как это выражение не действительно в SQL.
Посмотрите, что надо изменить на таком воспроизводимом примере:
var rc refcursor
create or replace function readfile (
filename varchar2) return sys.odciVarchar2List pipelined is
begin
for i in 1..3 loop pipe row ('line'||i);
end loop;
return;
end;
/
declare
filename varchar2(100) :='DCO_CRN_TEST.xlsx';
result sys.odciVarchar2List;
sqlstmt clob := q'[
select column_value
from table (readfile (:fn))]';
begin
execute immediate sqlstmt bulk collect into result
using filename;
open :rc for select column_value line from table (result);
end;
/
Результат:
LINE
--------
line1
line2
line3