2

を使用しOracle SQL Developerて簡単な手順を作成しました。プロシージャは正常にコンパイルされますが、コマンドを入力すると次のようになります。

execute CMPPROJECTPROCSELECT();

BEGIN CMPPROJECTPROCSELECT(); END;

次のエラーが表示されます。

Error starting at line : 1 in command -
execute CMPPROJECTPROCSELECT()
Error report -
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'CMPPROJECTPROCSELECT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Error starting at line : 2 in command -
BEGIN CMPPROJECTPROCSELECT(); END;
Error report -
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'CMPPROJECTPROCSELECT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

これを解決するのを手伝ってください。私はそれが小さなエラーであることを知っています。また、データ型、名前の宣言を正しく指定しました。

私の手順コードは

CREATE OR REPLACE PROCEDURE CMPPROJECTPROCSELECT( 
  p_projectname IN VARCHAR2,
  p_description OUT VARCHAR2)
IS
BEGIN
  SELECT DESCRIPTION
    INTO p_description
    FROM CMPPROJECT
   WHERE PROJECTNAME = p_projectname;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    p_description:= NULL;
    COMMIT;
END CMPPROJECTPROCSELECT;
4

1 に答える 1

2
execute CMPPROJECTPROCSELECT();
BEGIN CMPPROJECTPROCSELECT();
 END;
  1. EXECUTESQL*Plusコマンドです。
  2. プロシージャに必要なパラメータを渡していません。プロシージャーに対して 2 つのパラメーターを宣言しました。
p_projectname IN VARCHAR2,
p_description OUT VARCHAR2

したがって、必要なパラメーターを宣言してから、プロシージャーに渡す必要があります。

DECLARE
  proj_desc VARCHAR2(2000);
BEGIN
  CMPPROJECTPROCSELECT('project_name', proj_desc);
  -- use the OUT value of proj_desc later
END;
/ 

ちなみに、 COMMITはまったく必要ありません。DMLを永続的にコミットする必要があり、SELECT ..INTO句とは関係ありません。

SELECT DESCRIPTION INTO p_description FROM CMPPROJECT WHERE PROJECTNAME = p_projectname;
EXCEPTION
      WHEN NO_DATA_FOUND THEN
        p_description:= NULL;
COMMIT;  -- You don't need COMMIT at all

更新作業デモンストレーション:

PL/SQL の場合:

SQL> CREATE OR REPLACE PROCEDURE get_emp(
  2      p_ename IN VARCHAR2,
  3      p_job OUT VARCHAR2)
  4  IS
  5  BEGIN
  6    SELECT job INTO p_job FROM emp WHERE ename = p_ename;
  7  END;
  8  /

Procedure created.

SQL> sho err
No errors.
SQL> set serveroutput on
SQL> DECLARE
  2    job VARCHAR2(20);
  3  BEGIN
  4    get_emp('SCOTT',JOB);
  5    DBMS_OUTPUT.PUT_LINE('The output is '||job);
  6  END;
  7  /
The output is ANALYST

PL/SQL procedure successfully completed.

SQL*Plus の場合:

SQL> VARIABLE JOB VARCHAR2(20);
SQL> EXECUTE get_emp('SCOTT', :JOB);

PL/SQL procedure successfully completed.

SQL> PRINT JOB;

JOB
--------------------------------
ANALYST
于 2015-11-09T06:50:01.000 に答える