2

これが私のコードです:

CREATE OR REPLACE FUNCTION customer_city_function(city_in IN VARCHAR2)
RETURN NUMBER
AS
  number_cus NUMBER := 0;

  CURSOR cus_cur IS
    SELECT COUNT(*)
      FROM customer
     WHERE customer_city = city_in;
BEGIN
  IF city_in IS NOT NULL THEN
    OPEN cus_cur;
    FETCH cus_cur INTO number_cus;
    CLOSE cus_cur;
  END IF;

  RETURN number_cus;
END;
/

ここに警告があります:

Error starting at line : 1 in command -
CREATE OR REPLACE FUNCTION customer_city_function(city_in IN VARCHAR2)
RETURN NUMBER
AS
  number_cus NUMBER := 0
Error report -
SQL Command: functıon CUSTOMER_CITY_FUNCTION
Failed: Warning: executing is completed with a warning


Error starting at line : 5 in command -
CURSOR cur_cur IS
Error report -
Unknown Command


Error starting at line : 6 in command -
SELECT COUNT(*)
    FROM costumer
    WHERE customer_city=city_in
Error at Command Line : 8 Column : 25
Error report -
SQL Error: ORA-00904: "CITY_IN": undefined variable
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:


Error starting at line : 9 in command -
BEGIN
  IF city_in IS NOT NULL
  THEN
    OPEN cus_cur;
    FETCH cus_cur INTO number_cus;
    CLOSE cus_cur;
  END IF;
RETURN (number_cus);
END;

Error report -
ORA-06550: row 2, column 6:
PLS-00201: 'CITY_IN' variable should been defined
ORA-06550: row 2, column 3:
PL/SQL: Statement ignored
ORA-06550: row 8, column 1:
PLS-00372: in a procedure, RETURN can not contain an expression
ORA-06550: row 8, column 1:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

私の間違いはどこですか?私はそれを見つけることができません、それは意味がありません。(この警告メッセージは私の言語から翻訳しました。正しく翻訳できたことを願っています。)

コマンドウィンドウで試してみたところ、うまくいきました。Oracle SQL DeveloperのSQLワークシートで機能しないのはなぜですか?

4

1 に答える 1

2

投稿されたコードに問題はありません。問題は、クライアントまたはコードのコンパイル方法にある可能性があります。

タグでPL/SQL Developerについて述べたように、SQL ワークシートに余分な文字が含まれている可能性があり、関数をscriptとしてコンパイルしているため、コンパイラはエラーを検出します。

これはSQL*Plusのデモで、エラーはありません。

SQL> CREATE OR REPLACE FUNCTION customer_city_function(i_deptno IN number)
  2  RETURN NUMBER
  3  AS
  4  number_cus NUMBER := 0;
  5  CURSOR cus_cur IS
  6  SELECT COUNT(*)
  7  FROM emp
  8  WHERE deptno=i_deptno;
  9  BEGIN
 10    IF i_deptno IS NOT NULL
 11    THEN
 12    OPEN cus_cur;
 13    FETCH cus_cur INTO number_cus;
 14    CLOSE cus_cur;
 15  END IF;
 16  RETURN number_cus;
 17  END;
 18  /

Function created.

SQL> sho err
No errors.
SQL> SELECT customer_city_function(10) FROM DUAL;

CUSTOMER_CITY_FUNCTION(10)
--------------------------
                         3

SQL>

私のコードの唯一の違いは、EMPテーブルの代わりにCUSTOMERSテーブルを使用し、入力パラメーターDEPTNOCITY_IN. その他はすべて同じで、関数はエラーなしでコンパイルおよび実行されます。

于 2015-05-07T06:23:09.830 に答える