簡體   English   中英

ORA-00917:缺少逗號並立即執行

[英]ORA-00917: missing comma with execute immediate

我正在嘗試制作一個插入行並在成功后返回rowcount的函數。 這是我的代碼。

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)

我讀了很多帖子。 大多數人忘記了右括號,但我不認為這是我的情況。 我想念什么?

好的,我找到了問題所在。 我需要在NVarchar2值周圍加上三引號。 像那樣。

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

如果您真的必須動態地執行此操作(我不相信),則此解決方案的打字錯誤更少,並且更好,因為在您的輸入參數之一包含單引號'情況下也可以使用。

    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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM