【问题标题】:Dynamically select column name within the Oracle insert statement在 Oracle 插入语句中动态选择列名
【发布时间】:2020-04-08 23:33:15
【问题描述】:

我有一张表,其结构如下:

SALES_RECS
---------------------------------------------------------------------
| DEPT | LOCATION | NUMBER1 | NUMBER2 | NUMBER3 | NUMBER4 | NUMBER5 |
---------------------------------------------------------------------

我有一个程序,我将在此表中插入数据。但是在插入数据时,我需要根据某些标准在 NUMBER1 到 NUMBER5 列之间进行选择。所以我将这一列设置为动态选择,如下所示:

-- BELOW VALUE WOULD BE RETRIEVED DYNAMICALLY
num_val := 4 

INSERT INTO SALES_RECS(DEPT, LOCATION, NUMBER||num_val)
VALUES ('CC', 'HOUSTON', 5000);

我收到如下错误:

PL/SQL: ORA-01747: invalid user.table.column, table.column, or column specification

我不确定,如何在插入语句中动态选择/设置列名。

非常感谢您的宝贵时间和提前帮助!

【问题讨论】:

    标签: oracle plsql oracle11g


    【解决方案1】:

    这是您需要的动态 SQL。这是一个例子。

    SQL> create table test (dept varchar2(2), number1 number, number2 number);
    
    Table created.
    

    基于PAR_DEPT 参数值,过程将插入number1number2 列。

    SQL> create or replace procedure p_test (par_dept in varchar2)
      2  is
      3    l_Str  varchar2(200);
      4    l_col  varchar2(30) := 'NUMBER';
      5  begin
      6    if par_dept = 'CC' then
      7       l_col := l_col || '1';
      8    else
      9       l_col := l_col || '2';
     10    end if;
     11
     12    l_str := 'insert into test (dept, ' || l_col || ')' ||
     13             '  values (' || chr(39) || par_dept || chr(39) || ', 5000)';
     14    execute immediate l_str;
     15  end;
     16  /
    
    Procedure created.
    

    测试:

    SQL> exec p_test('CC');
    
    PL/SQL procedure successfully completed.
    
    SQL> select * From test;
    
    DE    NUMBER1    NUMBER2
    -- ---------- ----------
    CC       5000
    
    SQL> exec p_test('AB');
    
    PL/SQL procedure successfully completed.
    
    SQL> select * From test;
    
    DE    NUMBER1    NUMBER2
    -- ---------- ----------
    CC       5000
    AB                  5000
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      您可以通过DECODE 使用静态sql,如下所示:

      INSERT INTO SALES_RECS(DEPT, LOCATION, NUMBER1,NUMBER2,NUMBER3,NUMBER4,NUMBER5)
      Select 'CC', 'HOUSTON',
             DECODE(NUM_VAL,1,5000),
             DECODE(NUM_VAL,2,5000),
             DECODE(NUM_VAL,3,5000),
             DECODE(NUM_VAL,4,5000),
             DECODE(NUM_VAL,5,5000)
        FROM DUAL;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多