【问题标题】:Dynamic SQL to select into a variable用于选择变量的动态 SQL
【发布时间】:2017-09-29 13:27:37
【问题描述】:

我正在尝试创建一个函数,该函数将采用表名,将该表名转换为列名,因为这是表的设计。该函数还接受一个代码,即表的 PK,并使用它来构造一个动态语句,该语句将选择值到一个变量中返回它。

我收到如下错误:

SP2-0552:未声明绑定变量“LOC_CODE_TAB”。

所以我的主要问题是何时使用派生值作为绑定变量,何时不使用。

这是我正在尝试的示例:

DECLARE
    loc_stmt      VARCHAR2(200);
    loc_return    VARCHAR2(30) := null;
    loc_code_tab  VARCHAR2(30);
    P_TABLE_NAME VARCHAR2(100) := 'BILLG_FRQNCY_TYPE';
    P_CODE      NUMBER := 1;
BEGIN
    loc_code_tab := SUBSTR(P_TABLE_NAME,1,LENGTH(P_TABLE_NAME)-3);

    loc_stmt := 
        'SELECT ' || :loc_code_tab || '_DESC' ||
         ' INTO ' || loc_return ||  
         ' FROM ' || :loc_code_tab || 
        ' WHERE ' || P_TABLE_NAME || ' = ' || :P_CODE;

    EXECUTE IMMEDIATE loc_stmt
        INTO loc_return
        USING IN loc_code_tab, IN loc_code_tab, IN P_CODE;
    DBMS_OUTPUT.PUT_LINE(loc_return);
END;
/

【问题讨论】:

    标签: sql oracle plsql dynamic-sql


    【解决方案1】:

    您不能将placeholders 用于动态查询中的表列。但是,您可以使用连接来满足您的要求。见下文:

    DECLARE
       loc_stmt       VARCHAR2 (200);
       loc_return     VARCHAR2 (30) := NULL;
       loc_code_tab   VARCHAR2 (30);
       P_TABLE_NAME   VARCHAR2 (100) := 'BILLG_FRQNCY_TYPE';
       P_CODE         NUMBER := 1;
    BEGIN
       loc_code_tab := SUBSTR (P_TABLE_NAME, 1, LENGTH (P_TABLE_NAME) - 3);
    
       loc_stmt :=
             'SELECT  '
          || loc_code_tab
          || '_DESC'
          || ' FROM '
          || loc_code_tab
          || ' WHERE '
          || P_TABLE_NAME
          || ' = '
          || P_CODE;
    
       EXECUTE IMMEDIATE loc_stmt  INTO loc_return ;
    
       DBMS_OUTPUT.PUT_LINE (loc_return);
    END;
    /
    

    【讨论】:

    • 好的,你的语法看起来更好,所以我会支持你。我拿的是原来的,看起来有点乱
    • 注意 p_code 你可以(实际上你应该)使用占位符和绑定变量。
    【解决方案2】:

    从变量名称中删除: 并移至立即执行的适当位置。

    DECLARE
        loc_stmt      VARCHAR2(200);
        loc_return    VARCHAR2(30) := null;
        loc_code_tab  VARCHAR2(30);
        P_TABLE_NAME VARCHAR2(100) := 'BILLG_FRQNCY_TYPE';
        P_CODE      NUMBER := 1;
    BEGIN
        loc_code_tab := SUBSTR(P_TABLE_NAME,1,LENGTH(P_TABLE_NAME)-3);
    
        loc_stmt := 
            'SELECT ' || loc_code_tab || '_DESC' ||
             ' FROM ' || loc_code_tab || 
            ' WHERE ' || P_TABLE_NAME || ' = ' || P_CODE;
    
        EXECUTE IMMEDIATE loc_stmt
            INTO loc_return;
        DBMS_OUTPUT.PUT_LINE(loc_return);
    END;
    /
    

    【讨论】:

    • 与我在下面发布的非常相似。
    • @XING 是的。我只是快了几秒钟;)这个想法是一样的
    • 非常感谢,就是这样。下一个要解决的问题是如何使用 Dynamic 进入关联数组。同样的逻辑在那里可以工作吗?
    • 在这种情况下,您可能需要bulkstackoverflow.com/questions/21117021/…dba-oracle.com/plsql/t_plsql_dynamic.htm 可以帮助你
    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2016-07-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多