2017-09-29 81 views
0

我想创建一个函数,将采取在表名称,采取该表名称并将列入名称,因为这是表的设计。该函数还包含表中的代码PK,并使用它构造一个Dynamic语句,该语句将选择该值并将其返回给变量。动态SQL选择到一个变量

我得到这样的错误:

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

回答

2

不能使用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; 
/
+0

非常感谢,那个窍门 – programmerNOOB

+0

确定你的语法看起来更好,所以我会upvote你。我已经采取了原来的一个看起来有点混乱 – Kacper

+0

p_code注意你可以(实际上你应该)使用占位符和绑定变量。 –

1

从varaibles的名字删除:和迁入立即执行的适当位置。

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

与我在下面发表的内容非常相似。 – XING

+0

@XING yup。我只是快了几秒;)这个想法是一样的 – Kacper

+0

非常感谢你,就是这样。下一个要解决的问题是如何使用Dynamic进入关联数组。这同样的逻辑会在那里工作吗? – programmerNOOB