oracle如何将值转换为变量对象名称

时间:2019-01-24 09:34:33

标签: oracle plsql dynamic-sql

对不起,我的英语。...

我在表中有变量的名称。我需要恢复这些名称以用于计算变量的值。

    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

2 个答案:

答案 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);