代码之家  ›  专栏  ›  技术社区  ›  programmerNOOB

选择变量的动态SQL

  •  0
  • programmerNOOB  · 技术社区  · 8 年前

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

    我遇到了如下错误:

    SP2-0552:未声明绑定变量“LOC\u CODE\u 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;
    /
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   XING    8 年前

    您不能使用 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;
    /
    
        2
  •  1
  •   Kacper    8 年前

    去除 :

    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;
    /