2015-01-05 47 views
0

中傳遞字符值我有一個刪除程序,該程序以表名和某些值從該表中刪除記錄,因此我創建了一個執行immediate的過程,它正在形成刪除通過參數和刪除進行查詢。在程序中使用execute立即執行DML,並在參數

但是當過我傳遞的char值的參數是越來越錯誤:

invalid identifier 

與該字符值了單引號形成查詢。請讓我知道如何在程序中傳遞char值以正確形成字符串。

下面是具體的步驟:

CREATE OR replace PROCEDURE Prd_delete(p_tbl_name IN VARCHAR2, 
             p_sys  VARCHAR2, 
             p_b_id  VARCHAR2, 
             p_c_date NUMBER) 
IS 
    dlt_query VARCHAR2(200); 
BEGIN 
    dlt_query := 'delete from ' 
       ||p_tbl_name 
       ||' where system=' 
       ||p_sys 
       || ' And batch_id=' 
       ||p_b_id 
       || ' And cobdate=' 
       ||p_c_date; 

    --dbms_output.put_line(dlt_query); 
    EXECUTE IMMEDIATE dlt_query; 
END; 

/

下面是運行命令:

exec prd_delete ('TBL_HIST_DATA','M','N1',20141205); 

下面是錯誤:

ORA-00904:"N1" invalid identifier. 

如何正確地傳遞這種價值?請建議。

回答

2
  • 在首位,爲什麼你需要PL/SQLDELETE。你可以用簡單的SQL來完成。
  • 爲什麼是P_C_DATE a NUMBER,什麼數據類型是cobdate COLUMN。日期應始終爲DATE。如果列數據類型是DATE,那麼您將遇到更多錯誤。一定要注意聲明正確的數據類型。

使用dynamic SQL,在直接執行之前,最好使用DBMS_OUTPUT來查看查詢是否正確形成。我也建議使用quoting string literal technique使它更容易。

DBMS_OUTPUT.PUT_LINE(dlt_query);

與查詢的問題是,你缺少周圍的VARCHAR2類型single-quotation馬克。

修改查詢以 -

dlt_query := 'delete from '||P_TBL_NAME||' where system='||P_SYS|| 
      ' And batch_id='||''''||P_B_ID|| '''' || 
      ' And cobdate='||P_C_DATE; 
+1

oracle數據庫我需要像這樣..和cobdate是一個數字數據類型的設計。我不能將其更改爲DATE數據類型。無論如何感謝Ans。@ lalit – sabya

+0

@sabyasachikar,如果它解決了您的問題,請將其標記爲已回答。 –

0

你是之前和之後,如加上引號concatination

您可以修復期間丟失N1左右的報價。

dlt_query := 'delete from '||P_TBL_NAME||' where system='||P_SYS|| 
' And batch_id='||''''||P_B_ID|| '''' || 
' And cobdate='||P_C_DATE; 
0

如果必須使用EXECUTE IMMEDIATE語句,你應該使用綁定變量:我們需要從一個UNIX shell傳遞表名

CREATE OR REPLACE PROCEDURE prd_delete (P_TBL_NAME IN VARCHAR2, 
               P_SYS VARCHAR2, 
               P_B_ID VARCHAR2, 
               P_C_DATE NUMBER) IS 
      dlt_query VARCHAR2 (200); 
    BEGIN 
     dlt_query := 'delete from ' || P_TBL_NAME || ' where system=:1 and batch_id=:2 and cobdate=:3'; 
     BEGIN 
     EXECUTE IMMEDIATE dlt_query USING P_SYS, P_B_ID, P_C_DATE; 
     EXCEPTION 
     WHEN OTHERS THEN 
      -- catch exception !! 
     END; 
    END; 
/