2015-01-05 66 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; 
/