2014-11-25 88 views
0
exec home_lending_cus('9999999999', 'HOME LENDING', '11111111') 

我想運行上面的語句,但它拋出了下面提到的錯誤。如何運行程序

ORA-00933: SQL Command not properly ended. 
ORA-06512: at 'HOME_LENDING_CUS', line 6 
ORA-06512: at line1 

所有varchar2

CREATE OR REPLACE PROCEDURE home_lending_cus(
    id_no VARCHAR2, 
    prod_nme VARCHAR2, 
    rpt_dte NUMBER) authid current_user 
AS 
BEGIN 
    EXECUTE immediate 
    ' CREATE TABLE abc AS 
    SELECT bt.id, 
    ct.cus_id 
    FROM bnkr_tbl bt , 
    cus_tbl ct , 
    base_tbl bt 
    WHERE bt.id =ct.id 
    AND ct.id =bt.c_id 
    AND bt.pr_nme='||prod_nme|| ' 
    AND bt.dte ='||rpt_dte|| ' 
    AND bt.id ='||id_no|| ' 
    GROUP BY bt.id, 
    ct.cus_id'; 
END home_lending_cus; 
+0

你在哪個上下文/應用程序中嘗試執行該過程?可能僅僅是在行結尾缺少';'... – evilive 2014-11-25 06:29:43

+3

這意味着你的PL/SQL代碼中有語法錯誤。你還沒有發佈源代碼,所以我們不能告訴你它是什麼。但是,該消息包含LINE NUMBER,因此您確切知道在哪裏查找。 – APC 2014-11-25 06:30:57

+0

源是這裏 創建或替換過程home_lending_cus(id_no上VARCHAR2,prod_nme VARCHAR2,rpt_dte數) AUTHID CURRENT_USER作爲 開始 執行即時'創建表ABC作爲 選擇bt.id,從 bnkr_tbl ct.cus_id BT , cus_tbl ct ,base_tbl bt 其中 bt.id = ct.id 和ct.id = bt.c_id 和bt.pr_nme ='|| prod_nme || '和bt.dte ='|| rpt_dte || '和bt.id ='|| id_no || 'group by bt.id,ct.cus_id'; end home_lending_cus; – 2014-11-25 10:30:51

回答

2

類型的變量作爲@Aramillo指出,該字符串變量周圍的報價是錯誤的,這是使動態SQL不起作用。不過,我強烈建議轉移綁定變量,而不是連接。這不僅會避免那種錯誤的,它會保護你免受SQL注入:

CREATE OR REPLACE PROCEDURE home_lending_cus(
    id_no VARCHAR2, 
    prod_nme VARCHAR2, 
    rpt_dte NUMBER) authid current_user 
AS 
BEGIN 
    EXECUTE immediate 
    ' CREATE TABLE abc AS 
    SELECT bt.id, 
    ct.cus_id 
    FROM bnkr_tbl bt , 
    cus_tbl ct , 
    base_tbl bt 
    WHERE bt.id =ct.id 
    AND ct.id =bt.c_id 
    AND bt.pr_nme= :1 
    AND bt.dte = :2 
    AND bt.id = :3 
    GROUP BY bt.id, 
    ct.cus_id' using prod_nme, rpt_dte, id_no; 
END home_lending_cus; 

或者說,它會如果你被允許在DDL使用綁定變量。鑑於這種限制,我的傾向是將其分成兩個命令。

CREATE OR REPLACE PROCEDURE home_lending_cus(
    id_no VARCHAR2, 
    prod_nme VARCHAR2, 
    rpt_dte NUMBER) authid current_user 
AS 
BEGIN 
    EXECUTE immediate 
    ' CREATE TABLE abc (bt_id number, cus_id number)' 
    EXECUTE IMMEDIATE 
    'INSERT INTO abc (bt_id, cus_id) 
    SELECT bt.id, 
    ct.cus_id 
    FROM bnkr_tbl bt , 
    cus_tbl ct , 
    base_tbl bt 
    WHERE bt.id =ct.id 
    AND ct.id =bt.c_id 
    AND bt.pr_nme= :1 
    AND bt.dte = :2 
    AND bt.id = :3 
    GROUP BY bt.id, 
    ct.cus_id' using prod_nme, rpt_dte, id_no; 
END home_lending_cus; 

有一對夫婦的其他問題與此代碼,你可能要考慮:

  1. 您的查詢也是無效的,因爲你是在同一個FROM使用別名bt兩次條款。
  2. 我建議使用SQL-99風格的連接,而不是用逗號分隔的表格列表。
  3. 即時創建表的Oracle代碼總是有點可疑。你真的需要創建一個表嗎,還是可以使用全局臨時表?後者幾乎總是會是更好的選擇。
+0

我喜歡你的觀點@Allan – Aramillo 2014-11-25 14:28:05

+0

它拋出了同樣的錯誤。你是否也可以爲此添加exec過程命令。 – 2014-11-26 07:12:07

+0

ORA-01027 -bind變量不允許用於數據定義操作 ORA-06512:在 「home_lending_cus」,第5行 ORA-06512:在第1行 , 我試圖運行 - EXEC home_lending_cus( '99999999', 20140912) – 2014-11-26 07:21:31