对不起,我的英语。...
我在表中有变量的名称。我需要恢复这些名称以用于计算变量的值。
CREATE TABLE S2V_AMG_FLUSSI
(
COD_COMPAGNIA VARCHAR2(5 BYTE),
ID_FLUSSO INTEGER,
DS_FLUSSO VARCHAR2(500 BYTE),
DS_CONDIZIONE CLOB
);
Insert into S2V_AMG_FLUSSI
(COD_COMPAGNIA, ID_FAMIGLIA_FLUSSI, DS_FAMIGLIA_FLUSSI, ID_FLUSSO, DS_FLUSSO,
DS_CONDIZIONE)
Values
('32', 41, 'compagnia', 2, 'REVALORIZED',
'c_variabile');
declare
c_variabile varchar2(12) := 'aaa';
v_sql clob;
v_campo varchar2(100);
v_valore varchar2(100);
begin
select ds_condizione into v_campo from S2V_AMG_FLUSSI
where cod_compagnia=32
and id_flusso=1;
v_sql:='begin select :v_campo into :v_out from dual; end;' ;
execute immediate v_sql
USING v_campo , OUT v_valore;
dbms_output.put_line(v_valore);
exception
when others then
dbms_output.put_line('ERRORE: '||sqlerrm);
end;
输出:c_variabile
但是我想要:aaa
答案 0 :(得分:0)
由于许多原因,难以编写动态SQL。一是代码的抽象性质。您的声明...
v_sql:='begin select :v_campo into :v_out from dual; end;' ;
...产生一个查询,该查询返回v_campo
的内容。但是您想要的是一个查询,该查询返回名称存储在v_campo
中的变量的内容。
假设您编写了此代码:
v_sql:='begin select ' || v_campo ||' into :v_out from dual; end;' ;
execute immediate v_sql
USING OUT v_valore;
这很麻烦,因为c_variabile
在查询范围内是无效的标识符。
这将起作用...
v_sql:='begin select :'||v_campo||' into :v_out from dual; end;' ;
execute immediate v_sql
USING c_variabile, OUT v_valore;
...但是显然是没有用的,因为它可以硬编码您想要的软东西。
似乎起作用的是:
declare
c_variabile varchar2(12) := 'aaa';
v_sql clob;
v_campo varchar2(100) := 'c_variabile' ;
v_valore varchar2(100);
begin
v_sql:='declare '||v_campo||' varchar2(12) := :P1; begin select '||
v_campo||' into :v_out from dual; end;' ;
execute immediate v_sql
USING 'aaa', OUT v_valore;
dbms_output.put_line(v_valore);
exception
when others then
dbms_output.put_line('ERRORE: '||sqlerrm);
end;
这解决了您提出的问题,但感觉像在作弊。感觉就像是在作弊,因为它在作弊:生成的代码没有使用定义的变量c_variabile
,而是使用了硬编码的值'aaa'
。
这引起了一个相关的问题,值'aaa'
是从哪里来的?。可能您需要重新考虑您的方法,因为似乎您需要一个解决方案,该解决方案可以处理'aaa'
之类的值的动态获取以及动态处理它们。
就像我说的那样,动态SQL是棘手的东西。
答案 1 :(得分:-1)
只需删除变量名称中的对勾即可。
Insert into S2V_AMG_FLUSSI
(COD_COMPAGNIA, ID_FAMIGLIA_FLUSSI, DS_FAMIGLIA_FLUSSI, ID_FLUSSO, DS_FLUSSO, DS_CONDIZIONE)
Values ('32', 41, 'compagnia', 2, 'REVALORIZED', c_variabile);