Значение переменной видит с кавычками, как убрать?

Данный код работает:

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 шт):

Автор решения: 0xdb

В динамическом запросе заначения надо передовать используя 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
→ Ссылка