2

次のストアド プロシージャがあります。

create or replace PROCEDURE A2CountSkus
(v_count out Number )
AS
 BEGIN 
   SELECT count(*)
      INTO v_count
      FROM a2sku;
   EXCEPTION 
 When Others THEN
    RAISE;
END A2CountSkus;

このスクリプトを実行すると。

SET SERVEROUTPUT ON 
BEGIN 
DBMS_OUTPUT.PUT_LINE('SKU COUNT ' || A2CountSkus); 
END; 
/ 

出力が印刷される代わりに、エラーが発生します。

4

1 に答える 1

3

まず、通常、値を返すことのみを目的とする名前付き PL/SQL ブロックがある場合は、プロシージャではなく関数を宣言します。数値を返す関数として宣言A2CountSkusした場合は、使用する構文が機能します。

第二に、その例外句は必要ありません。それは役に立ちません。それは排除されるべきです。

第 3 に、ブロックをプロシージャにしたい場合、呼び出し元は、プロシージャに渡すことができるローカル変数を宣言し、ローカル変数の値を出力する必要があります。

関数を宣言したい場合

create or replace FUNCTION A2CountSkus
  return integer
AS
  l_count integer;
BEGIN 
  SELECT count(*)
    INTO l_count
    FROM a2sku;
  RETURN l_count;
END A2CountSkus;

プロシージャを宣言したいことが確実な場合、呼び出し元は次のようにする必要があります

DECLARE
  l_count integer;
BEGIN 
  A2CountSkus( l_count );
  DBMS_OUTPUT.PUT_LINE('SKU COUNT ' || l_count); 
END; 
于 2012-09-30T07:49:21.877 に答える