2017-09-25 81 views
0

下面是一個例子查詢,我想我的程序產生如何通過字符串值作爲參數PLSQL過程

select * 
    from Registration 
    where Loc_ID = 6 
    AND CROP_ID = 163 
    AND REG_NAME = 'Apiro MX'; 

REG_NAMEvarchar2()

我已創建了一個程序,在這裏我想執行一個查詢類似下面

query := 'select REG_ID from Registration where loc_id = ' || 
      countryid || ' AND Crop_id = ' || cropid || 
      ' AND Reg_name = '|| ''' || productid || ''' || '; 

我得到的REG_NAME部分錯誤,它正在productid as " || productid ||"

你能否幫我準確的查詢一下。

+1

你爲什麼要爲該查詢使用動態SQL? (如果你有一個真正的理由,爲什麼你不使用綁定變量?) –

+0

我們不能使用動態sql做到這一點,如果可能的話,請你糾正我的查詢。 –

+0

當然,你可以通過轉義你正在使用的引號,或者(很多)最好使用綁定變量;但你爲什麼要?它效率較低,難以維護。 –

回答

1

你並不需要使用動態SQL:

CREATE PROCEDURE get_registration (
    i_countryid IN REGISTRATION.LOC_ID%TYPE, 
    i_crop_id IN REGISTRATION.CROP_ID%TYPE, 
    i_reg_name IN REGISTRATION.REG_NAME%TYPE, 
    o_cursor OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
    OPEN o_cursor FOR 
    SELECT * 
    FROM Registration 
    WHERE Loc_ID = i_countryid 
    AND CROP_ID = i_crop_id 
    AND REG_NAME = i_reg_name; 
END; 
/

如果您確實需要動態SQL(但你幾乎總是可以做到無):

CREATE PROCEDURE get_registration (
    i_countryid IN REGISTRATION.LOC_ID%TYPE, 
    i_crop_id IN REGISTRATION.CROP_ID%TYPE, 
    i_reg_name IN REGISTRATION.REG_NAME%TYPE, 
    o_cursor OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
    OPEN o_cursor 
    FOR 'SELECT * 
     FROM Registration 
     WHERE Loc_ID = :i 
     AND CROP_ID = :j 
     AND REG_NAME = :k' 
    USING i_countryid, i_crop_id, i_reg_name; 
END; 
/
+0

,可以嗎?你能糾正這個問題嗎? –

+0

原始查詢是「正確的」,但是,我可以爲您提供一個替代方案。 – MT0

-1

在PLSQL可以通過增加另一個來逃避報價,因此, 您應該在productid周圍放置雙引號。 試着這麼做:

query := 'select REG_ID from Registration where loc_id = ' || 
     countryid || ' AND Crop_id = ' || cropid || 
     ' AND Reg_name = '|| '''' || productid || '''' || '; 

或者不使用動態SQL和嘗試創建存儲過程 (檢查鏈接的指令)。 http://plsql-tutorial.com/plsql-procedures.htm

+1

這是一個壞主意[XKCD](https://xkcd.com/327/) - 如果你不使用綁定變量,那麼用戶可以做一些意想不到的事情,比如將'productid'作爲'Apiro MX'和EXISTS(SELECT 1 FROM your_password_table WHERE passwordhash ='123456')AND'1'='1'。 – MT0