【问题标题】:ORA-00917: missing comma with execute immediateORA-00917: 立即执行时缺少逗号
【发布时间】:2015-03-09 10:14:51
【问题描述】:

我正在尝试创建一个插入行并在成功时返回行数的函数。这是我的代码。

create or replace FUNCTION "FUNCINSERTROW"
(V_PARAM IN NVarChar2
,V_PARAM2 IN NVarChar2
,V_PARAM6 IN NVarChar2
,V_PARAM4 IN NVarChar2
,V_PARAM5 IN NVarChar2
,V_PARAM6 IN NVarChar2
,V_PARAM7 IN NVarChar2
,V_PARAM8 IN NVarChar2
,V_PARAM9 IN NVarChar2
,V_PARAM10 IN NVarChar2
,V_PARAM11 IN NVarChar2
,V_PARAM12 IN Number
,V_PARAM13 IN NVarChar2
,V_PARAM14 IN NVarChar2
,V_PARAM15 IN NVarChar2
,V_PARAM16 IN NVarChar2
,V_PARAM17 IN NVarChar2
,V_PARAM18 IN NVarChar2
,V_PARAM19 IN NVarChar2
,V_PARAM20 IN NVarChar2
,V_PARAM21 IN NVarChar2
,V_PARAM22 IN NVarChar2
,V_PARAM23 IN NVarChar2
,V_PARAM24 IN NVarChar2
,V_PARAM25 IN NVarChar2
,V_PARAM26 IN NVarChar2
,V_PARAM27 IN NVarChar2
,V_PARAM28 IN NVarChar2)

RETURN NUMBER AS 
BEGIN
DECLARE
  v_requete   varchar2(5000);
  BEGIN

v_requete := 'INSERT INTO TABLE (PARAM,PARAM2,PARAM3,PARAM4,PARAM5,PARAM6,' ||
              'PARAM7,PARAM8,PARAM9,PARAM10,PARAM11,PARAM12,PARAM13,PARAM14,PARAM15,PARAM16,PARAM17,PARAM18,PARAM19,' ||
              'PARAM20,PARAM21,PARAM22,PARAM23,PARAM24,PARAM25,PARAM26,PARAM27,PARAM28)' ||
              'VALUES ('||V_PARAM||','||V_PARAM2||','||V_PARAM3||','||V_PARAM4||','||V_PARAM5||','||V_PARAM6||','||V_PARAM7||','||V_PARAM8||
              ','||V_PARAM9||','||V_PARAM10||','||V_PARAM11||','||V_PARAM12||','||V_PARAM13||','||V_PARAM14||','||V_PARAM15||','||V_PARAM16||
              ','||V_PARAM17||','||V_PARAM18||','||V_PARAM19||','||V_PARAM20||','||V_PARAM21||','||V_PARAM22||','||V_PARAM23||','||V_PARAM24||
              ','||V_PARAM25||','||V_PARAM26||','||V_PARAM27||','||V_PARAM28||')';


  execute immediate v_requete;
  RETURN SQL%ROWCOUNT;


  EXCEPTION
      WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR(-20996,SQLERRM || ' - ANNUDATA:' || v_requete);
  END;
END FUNCINSERTROW;

这是它给我的错误。

ORA-20996: ORA-00917: missing comma - ANNUDATA:INSERT INTO Table (PARAM,PARAM2,PARAM3,PARAM4,PARAM5,PARAM6,PARAM7,PARAM8,PARAM9,PARAM10,PARAM11,PARAM12,PARAM13,PARAM14,PARAM15,PARAM16,PARAM17,PARAM18,PARAM19,PARAM20,PARAM21,PARAM22,PARAM23,PARAM24,PARAM25,PARAM26,PARAM27,PARAM28)VALUES (t,t,t,t,t,16,PO,t,t,t,t,7740,NO,DO,t,t,TEST,2C,t,t,t,Ben,t,t,t,997,t,t)

我读了很多帖子。大多数人忘记了右括号,但我不认为这是我的情况。我错过了什么?

【问题讨论】:

  • 我想知道你为什么会遇到这个错误代码,我正在构建架构没有错误。
  • 您插入语句的 varchar 值没有括起来的引号 - 这可能是一个问题
  • 你认为我应该添加这样的简单引号吗? '''||V_TELEPHONE_F||'''
  • 你做动态SQL有什么原因吗?简单的INSERT 也一样。
  • 网站仍然会通过函数内部的简单INSERT 语句知道插入是否成功。就做BEGIN INSERT INTO TABLE blah blah... END;

标签: sql oracle plsql oracle11g


【解决方案1】:

好的,我找到了问题所在。我需要在 NVarchar2 值周围加上三引号。像那样。

'''||V_PARAM||''','''||V_PARAM2||''','''||V_PARAM3||''','''||V_PARAM4||'''

【讨论】:

    【解决方案2】:

    如果您真的必须动态执行(我不相信),此解决方案的打字错误更少,效果更好,因为在您的输入参数之一包含单引号 ' 的情况下也可以使用。

        v_requete   VARCHAR2(5000);
    BEGIN
        v_requete := 'INSERT INTO TABLE (PARAM';
        FOR i IN 2..28 LOOP
            v_requete := v_requete ||',PARAM'||i;
        END LOOP;
        v_requete := v_requete ||') VALUES (:p1';
        FOR i IN 2..28 LOOP
            v_requete := v_requete ||',:p'||i;
        END LOOP;
        v_requete := v_requete ||')';
    
        EXECUTE IMMEDIATE v_requete USING
            PARAM, PARAM2, PARAM3, PARAM4, PARAM5,
            PARAM6, PARAM7, PARAM8, PARAM9 PARAM10,
            PARAM11, PARAM12, PARAM13, PARAM14 PARAM15,
            PARAM16, PARAM17, PARAM18, PARAM19 PARAM20,
            PARAM21, PARAM22, PARAM23, PARAM24 PARAM25,
            PARAM26, PARAM27, PARAM28;   
        RETURN SQL%ROWCOUNT;
    
    EXCEPTION
        WHEN OTHERS THEN
            RAISE_APPLICATION_ERROR(-20996,SQLERRM || ' - ANNUDATA:' || v_requete);
        END;
    END FUNCINSERTROW;
    

    【讨论】:

    • 抱歉,我真的需要这样做。无论如何,我找到了解决方案,只是发布了它:)
    • 这个答案真的很聪明。谢谢。参数的名称实际上不是“ParamXX”,但它适用于我提交的代码示例。我总是可以像以前一样声明 v_requete 并像你一样调用参数。谢谢。 PS:我需要将请求存储在 Varchar2 中,因为我的网站将显示确切的请求,所以我需要在将来将它作为返回值传递给某个地方。我找到的解决方案在本主题答案中仍然可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多