2017-03-14 6 views
0

私はプロジェクトで作業しており、SQLクエリの代わりにストアドプロシージャを記述する必要があります。私は以前これをやったことがなく、私は今書かれたSQLを手続きに変換してみました。しかし、私はこのエラーを無料では得られませんでした。あなたの人々からの任意の提案は、この..ストアドプロシージャへのSQL

SQLの固定に非常に有用である:

create or replace 
PROCEDURE MS_TST_PROC AS 

BEGIN 

DECLARE 
    l_organization varchar2(40); 
    l_framework varchar2(10); 
    l_sub_category_code varchar2(20); 
    l_sub_category varchar2(20); 
    l_TST_function varchar2(20); 
    l_questionnaire_name varchar2(20); 
    l_responded_on varchar2(20); 
    l_overall_score number(10); 
    l_target_score number(10); 
    l_maturity number(10,2); 
    l_full_name varchar2(20); 

    cursor c_get_details 
is 

    select 
    ts.organization_name, 
    q.framework, 
    q.sub_category_code, 
    q.sub_category, 
    tst.tst_function, 
    q.questionnaire_name, 
    resp.responded_on , 
    resp.overall_score, 
    ts.target_score, 
    Round((resp.overall_score/ts.target_score)*100,2) as Maturity, 
    users.first_name || ' ' || users.last_name as full_name 
    into 
    l_organization, 
    l_framework, 
    l_sub_category_code, 
    l_sub_category, 
    l_tst_function, 
    l_questionnaire_name, 
    l_responded_on, 
    l_overall_score, 
    l_target_score, 
    l_maturity, 
    l_full_name 

from MS_CMM_QUESTIONNAIRE q 
INNER JOIN MS_CMM_TARGET_SCORE ts 
on q.sub_category_code = ts.sub_category_code 
INNER JOIN MS_CMM_CSF_FUNCTIONS tst 
on tst.sub_category_code = q.sub_category_code 
INNER JOIN MS_QSM_QUESTIONNAIRE qsm 
on q.QUESTIONNAIRE_NAME = qsm.QUE_NAME 
INNER JOIN MS_QSM_QUESTNR_RESP resp 
on resp.QUESTIONNAIRE_ID = qsm.QUE_ID 
and resp.applies_to_object = ts.organization_name 
INNER JOIN SI_USERS_T users 
on users.user_name = resp.respondent; 

END MS_TST_PROC; 

とコンパイルエラーを言う:

Error(60,1): PLS-00103: Encountered the symbol "END" when expecting one of the following:  begin function pragma procedure subtype type <an identifier> <a double-quoted delimited-identifier> current cursor delete exists prior 
+1

あなたは、SQLサーバーで作業していますか? SQL Serverに(まだ)作成または置換はありません。エラーメッセージはOracleからのものです。 –

+0

申し訳ありません、あなたは正しいです、私のタグを変更してください。 – samuelebe

+0

@SeanLange私は同じことを考えていました。 – Mike

答えて

3

は問題がいくつかあります:

  • DECLARE次の文がないBEGINまたはEND声明。
  • CURSORにはINTO句があります。彼らはそこにいることはできません。クエリが単一の行を返した場合は、SELECT ... INTO ...(下記参照)を使用してください。複数行を処理する必要がある場合は、カーソルループを使用できます。

また、あなたのコードをフォーマットし、インデントの適切なレベルを維持するならば読み(および比類のないDECLARE/BEGIN/END文を見つけるために)はるかに簡単です。このような

何か:

CREATE PROCEDURE MS_TST_PROC 
AS 
    l_organization  MS_CMM_TARGET_SCORE.ORGANIZATION%TYPE; 
    l_framework   MS_CMM_QUESTIONNAIRE.FRAMEWORK%TYPE; 
    l_sub_category_code MS_CMM_QUESTIONNAIRE.SUB_CATEGORY_CODE%TYPE; 
    l_sub_category  MS_CMM_QUESTIONNAIRE.SUB_CATEGORY%TYPE; 
    l_TST_function  MS_CMM_CSF_FUNCTIONS.TST_FUNCTION%TYPE; 
    l_questionnaire_name MS_CMM_QUESTIONNAIRE.QUESTIONNAIRE_NAME%TYPE; 
    l_responded_on  MS_QSM_QUESTNR_RESP.RESPONDED_ON%TYPE; 
    l_overall_score  MS_QSM_QUESTNR_RESP.OVERALL_SCORE%TYPE; 
    l_target_score  MS_CMM_TARGET_SCORE.TARGET_SCORE%TYPE; 
    l_maturity   number(10,2); 
    l_full_name   varchar2(20); 
BEGIN  
    SELECT ts.organization_name, 
     q.framework, 
     q.sub_category_code, 
     q.sub_category, 
     tst.tst_function, 
     q.questionnaire_name, 
     resp.responded_on, 
     resp.overall_score, 
     ts.target_score, 
     Round((resp.overall_score/ts.target_score)*100,2), 
     users.first_name || ' ' || users.last_name 
    INTO l_organization, 
     l_framework, 
     l_sub_category_code, 
     l_sub_category, 
     l_tst_function, 
     l_questionnaire_name, 
     l_responded_on, 
     l_overall_score, 
     l_target_score, 
     l_maturity, 
     l_full_name 
    FROM MS_CMM_QUESTIONNAIRE q 
     INNER JOIN MS_CMM_TARGET_SCORE ts 
     on q.sub_category_code = ts.sub_category_code 
     INNER JOIN MS_CMM_CSF_FUNCTIONS tst 
     on tst.sub_category_code = q.sub_category_code 
     INNER JOIN MS_QSM_QUESTIONNAIRE qsm 
     on q.QUESTIONNAIRE_NAME = qsm.QUE_NAME 
     INNER JOIN MS_QSM_QUESTNR_RESP resp 
     on resp.QUESTIONNAIRE_ID = qsm.QUE_ID 
      and resp.applies_to_object = ts.organization_name 
     INNER JOIN SI_USERS_T users 
     on users.user_name = resp.respondent; 

    -- Do something with the values. 
END MS_TST_PROC; 
/
+0

その他の問題:複数の行を含む結果セットの処理(可能性が高い)。結果セットを制限するためにパラメータを渡します。 – APC

+0

ありがとうMT0、私は適切なインデントに従って、それを正常にコンパイルすることができました。私は出力で複数の行を処理するつもりです。カーソルを使ってすべての結果をループする必要があると思いますか? – samuelebe

+0

@samuelebe複数の行を扱う場合は、カーソルループが必要になるか、BULK COLLECT INTOとコレクションを使用する必要があります。 – MT0

関連する問題