2017-12-25 25 views
0

私はPl SQLを初めて使用しています。私は、プロシージャを実行しようとすると、これらのエラーを取得しています:エラー:PLS-00103:シンボル "/"が発生しました

Encountered the symbol "Create" with begin case declare end exception exit for goto if loop mod null pragma raise return select update while with << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge:

私はこれらのエラーを引き起こすもののために、これに似た例を探して試してみましたが、結果は十分ではなかったです。そして、これは私のスクリプトです:

CREATE OR REPLACE PROCEDURE CommandScript IS 
BEGIN 
    EXECUTE IMMEDIATE 'DROP TABLE sf_tmp'; 
    EXCEPTION 
    WHEN OTHERS THEN IF SQLCODE != -942 
     THEN RAISE; 
     END IF; 

create table sf_tmp(smcard varchar2(17),p_line varchar2(1000)); 

INSERT INTO dec_tmp(DECSCNR,DECSCPSNR) 
    SELECT TRIM (SUBSTRB (qinputstring, INSTR (qinputstring, '|', 1, 2) + 1,11)) dec_nr, 
     decoders.decscpsnr FROM bgqueue, decoders WHERE qworktype = 10 
     AND decoders.decscpsnr > 0 AND decoders.decscnr = 
     TRIM (SUBSTRB (qinputstring,INSTR (qinputstring, '|', 1, 2) + 1,11)) 
     AND LENGTH (TRIM (SUBSTRB (qinputstring,INSTR (qinputstring, '|', 1, 2) + 1,11))) = 11; 

commit; 


declare 
CURSOR smcard_cursor IS 
    (select d.DECSCNR,d.DECSCPSNR from dec_tmp d);     


CURSOR prod_cursor (v_pslink number) IS 
    (select p.psdecscpsnrlink, c.CPCSIENTITLEMENTS 
     from csiprod c, prodsubs p 
     where p.psdecscpsnrlink = v_pslink 
      and c.CPIBSPRODUCTNR = p.psproductnr 
      and c.CPCONDITIONNR =1 
      and c.cpcsientitlements<>'NILDRA' 
      and p.psstatus = 'A') ; 

    m_decno varchar2(17) ; 
    v_decno varchar2(17) ; 
    prod_line VARCHAR2(1000) ; 
    prod_full VARCHAR2(1000) ; 
    comma_line VARCHAR2(1000) ; 

    prod_len number ; 
    prod_diff number ; 
    new_prodct varchar2(300) ; 

    L_Size NUMBER ; 
    new_size number ; 
    s_link number ; 
    space_con number ; 
    sw number ; 
BEGIN 


FOR smcard_record IN smcard_cursor LOOP 
    prod_line := '' ; 
    prod_full := '' ; 
    comma_line := '' ; 
    prod_len :=0 ; 
    prod_diff :=0 ; 
    L_Size :=0 ; 
    new_size := 0 ; 

    space_con := 0; 
    new_prodct := '' ; 


    sw := 0 ; 
    S_link := smcard_record.decscpsnr ; 
    v_decno:= substr(smcard_record.decscnr,1,10) ; 
    m_decno:= substr(smcard_record.decscnr,1,11) ; 


FOR prod_record IN prod_cursor (s_link) LOOP 
    SW := 1 ; 
    prod_len := length(prod_record.CPCSIENTITLEMENTS) ; 
    prod_diff := mod(prod_len,6) ; 

    if prod_diff = 0 THEN 
     new_prodct := prod_record.CPCSIENTITLEMENTS ; 
    else 
     space_con :=prod_len+6-prod_diff ; 
     new_prodct := rpad(prod_record.CPCSIENTITLEMENTS, space_con,' ') ; 
    end if ;  

    prod_line := prod_line || new_prodct ; 
    end loop ; 



if sw = 1 then 
L_size := length(prod_line) ; 
comma_line := comma_line || substr(prod_line,1,6); 

for I in 1..L_size LOOP 
    IF MOD(I,6) = 0 THEN        
     comma_line := comma_line ||',' || substr(prod_line,(I+1),6) ; 
    END IF; 
end loop ; 

new_size := length(comma_line) - 1 ; 
comma_line := substr(comma_line,1,new_size) ; 



prod_FULL :='SOFULL'||','||'002000,'|| v_decno||',EGY,'||'EG,'||'NONE  ,'||comma_line ; 

insert into sf_tmp (smcard,p_line) values (m_decno,prod_full) ; 
commit ; 

end if ; 

end loop ; 
END; 
END; 
+0

これは広すぎます。小さな部分にコードを分割し、問題の原因となっている機能を特定します。次に、プロジェクト全体をデバッグするようにguthubへのリンクを提供します。これを読んでください:https://stackoverflow.com/help/mcve – MatBailie

答えて

1

私はあなたがネイティブの手順でDDLを実行することはできませんライン10

+0

私はそれを削除する場合私は "作成"と同じエラーを取得するbegin case declare end exception exit for goto if loop mod nullプラグマを返すreturn update while while while <識別子>二重引用符で囲まれた区切り記号 - <バインド変数><<引き続き現在の削除フェッチロックを閉じる オープンロールバックセーブポイントセットを挿入するSQL実行コミットをすべて実行する マージパイプパージ – AhmedNazeh

+1

'END CommandScript;'手続きが9行目で終了しているので、最後にはわかりません。 スクリプトのこの部分を実行して結果を教えてもらえますか? プロシージャを作成または置換するCommandScript IS BEGIN EXECUTE IMMEDIATE 'DROP TABLE sf_tmp'; 例外 その他の場合 IF SQLCODE!= -942 THEN RAISE; END IF; END; – jmowla

+0

正常に動作していますが、現在のところCreateでエラーが発生しています。 Error:PLS-00103:次のいずれかが予想される場合、シンボル "CREATE"が発生しました: (begin case declare end exit exit goto ifループ・モーフ null pragma raise return中にある更新を選択する <識別子>二重引用符で囲まれた区切り記号 - <バインド変数><<引き続き現在の削除フェッチロックを閉じる オープンロールバックセーブポイントを挿入するSQLをコミットするforallを実行する マージパイプパージ – AhmedNazeh

1

で「/」は必要ありません信じて。

:あなたの手順では、あなたはので、これがあるべきコンパイルされたコードで declareを必要としない

create procedure begin ... declare ... begin ... end ... end 

を見ているわけあなたbegin文を、終わらないEXECUTE IMMEDIATE

create table sf_tmp(smcard varchar2(17),p_line varchar2(1000)); 

で包み

create procedure ... begin ... end ... begin ... end 

第2のbegin ... endは、コンパイル時に実行したいものです(つまり、テーブルの作成と削除)

プロシージャ内に存在しないテーブルを参照することはできません。あなたのテーブルが最初に存在しないようにしているとすれば、これをEXECUTE IMMEDIATEにラップする必要があります。

insert into sf_tmp (smcard,p_line) values (m_decno,prod_full) ; 

ANSI join syntaxを使用して、というよりも大幅にあなたを助けるべきであるあなたのWHERE

Oracle recommends that you use the FROM clause OUTER JOIN syntax rather than the Oracle join operator. Outer join queries that use the Oracle join operator (+) are subject to the following rules and restrictions, which do not apply to the FROM clause OUTER JOIN syntax:

LISTAGG()に入社起動してください。

A global temporary tableは、手順でDDLを実行する必要性を排除する必要があります。

それは単一INSERT文で行うことができるようにあまりにもハード調査しなければ、あなたの全体の手順は、後で実行される部分SQLを生成しているように見える、

最後に...見えます。このと非常に具体的な状況では有効ですが、続行するかどうかを真剣に再考したいと思います。

関連する問題