1

私はストアドプロシージャが初めてです。ストアド プロシージャを実行しようとすると、次のエラーが発生します: PLS-00103: Encountered the symbol "SELECT" when expected one of the following: begin function pragma procedure... PLS-00103: Encountered the symbol "RETURN" when次のいずれかが必要です: * & = - + </ > at in is mod 剰余 not rem then... これらのエラーの原因とこれに類似した例を検索しようとしましたが、結果は十分ではありませんでした。これらのエラーが発生する理由についての手がかりはありますか? コードは次のとおりです。

CREATE OR REPLACE PROCEDURE LIST_ACTIONS_CHECK_ADD 
(
  LISTNAME IN VARCHAR2  
) AS 
BEGIN
 DECLARE CNT NUMBER;
 SELECT COUNT(LIST_NAME) INTO CNT FROM LISTS_MASTER WHERE LIST_NAME = LISTNAME;
IF (CNT > 0)
 RETURN 1
ELSE
 RETURN 0
END IF;
END LIST_ACTIONS_CHECK_ADD;

新しいコード:

CREATE OR REPLACE PROCEDURE LIST_ACTIONS_CHECK_ADD 
(
  P_LISTNAME IN VARCHAR2  
) 
AS 
 L_CNT NUMBER;
BEGIN
 SELECT COUNT(LIST_NAME) 
   INTO L_CNT 
   FROM LISTS_MASTER 
  WHERE LIST_NAME = P_LISTNAME;
 IF (L_CNT > 0)
   RETURN 1;
 ELSE
   RETURN 0;
  END IF;
END LIST_ACTIONS_CHECK_ADD;
4

2 に答える 2

2
  • (訂正#1)プロシージャで値を返すことはできません。NUMBERを返すには、LIST_ACTIONS_CHECK_ADDを削除して、関数として宣言する必要があります
  • (訂正#2)CNTの宣言を次のように移動する必要があります(以下を参照)
  • (訂正#3)returnステートメントにはセミコロンが必要です。
  • (訂正#4)IFの後にTHENが必要です(CNT> 0)(以下を参照):


DROP PROCEDURE LIST_ACTIONS_CHECK_ADD;
CREATE OR REPLACE FUNCTION LIST_ACTIONS_CHECK_ADD
(
   LISTNAME IN VARCHAR2  
) 

RETURN NUMBER AS 

  CNT NUMBER;
BEGIN
    SELECT COUNT(LIST_NAME) INTO CNT FROM LISTS_MASTER WHERE LIST_NAME = LISTNAME;
    IF (CNT > 0) THEN
       RETURN 1;
    ELSE
       RETURN 0;
    END IF;
END LIST_ACTIONS_CHECK_ADD;

これは、SQLPLUSから次のように実行できます。

SET SERVEROUTPUT ON SIZE 100000;
DECLARE
    V_RESULT NUMBER;
BEGIN

    V_RESULT := LIST_ACTIONS_CHECK_ADD('X');
    DBMS_OUTPUT.PUT_LINE('RESULT: ' || V_RESULT);

END;    
于 2012-12-06T16:39:41.950 に答える
2

ストアド プロシージャ宣言のスケルトンは次のとおりです。

CREATE OR REPLACE PROCEDURE procedure_name( <<parameters>> ) 
AS
  <<variable declarations>>
BEGIN
  <<code>>
END procedure_name;

投稿したコードでは、

  1. BEGINを変数宣言の前に置きます
  2. 余分なものがありDECLAREます - . を含まない PL/SQL ブロックを宣言している場合にのみ使用しますCREATE
  3. RETURNステートメントの後にセミコロンがありません。
  4. プロシージャは値を返すことができません。1 または 0 のいずれかを返したい場合は、おそらくプロシージャではなく関数が必要です。プロシージャが必要な場合は、OUTパラメーターを宣言できます。
  5. あなたはのTHEN後に行方不明ですIF

次のようなものが欲しいようです

CREATE OR REPLACE FUNCTION LIST_ACTIONS_CHECK_ADD 
(
  LISTNAME IN VARCHAR2  
) 
  RETURN NUMBER
AS 
 CNT NUMBER;
BEGIN
 SELECT COUNT(LIST_NAME) 
   INTO CNT 
   FROM LISTS_MASTER 
  WHERE LIST_NAME = LISTNAME;
 IF (CNT > 0)
 THEN
   RETURN 1;
 ELSE
   RETURN 0;
  END IF;
END LIST_ACTIONS_CHECK_ADD;

一般的に、何らかの命名規則を使用して、パラメーターとローカル変数が列の名前を共有しないようにする方が一般的であることに注意してください。がパラメーターなのか列名なのか、そしてLISTNAMEと の違いを理解しようとすると、将来のプログラマーは一般的に混乱します。個人的には、パラメーターにはプレフィックスを、ローカル変数にはプレフィックスを使用します。アンカー型を使用することもお勧めします-それが渡されている場合LIST_NAMELISTNAMEp_l_lists_master.list_name%type

CREATE OR REPLACE FUNCTION LIST_ACTIONS_CHECK_ADD 
(
  P_LIST_NAME IN lists_master.list_name%type
) 
  RETURN NUMBER
AS 
 L_CNT NUMBER;
BEGIN
 SELECT COUNT(LIST_NAME) 
   INTO L_CNT 
   FROM LISTS_MASTER 
  WHERE LIST_NAME = P_LIST_NAME;
 IF (L_CNT > 0)
 THEN
   RETURN 1;
 ELSE
   RETURN 0;
  END IF;
END LIST_ACTIONS_CHECK_ADD;
于 2012-12-06T16:34:39.607 に答える