Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle sqlplus内部的调用过程_Oracle_Plsql - Fatal编程技术网

Oracle sqlplus内部的调用过程

Oracle sqlplus内部的调用过程,oracle,plsql,Oracle,Plsql,我使用的是sqlplus代码和plsql,我在plsql中的过程工作得很好,但当我在sqlplus中执行过程时,我会遇到一些错误报告。 这是我的密码: set serveroutput on; DECLARE ENDDATE DATE; BEGIN SELECT SOME_DATE INTO ENDDATE FROM HEADER WHERE ID=1182446; IF ENDDATE >= TO_DATE('18-MAY-13') THEN EXECUTE SOMEPROCE

我使用的是sqlplus代码和plsql,我在plsql中的过程工作得很好,但当我在sqlplus中执行过程时,我会遇到一些错误报告。 这是我的密码:

set serveroutput on;

DECLARE
ENDDATE DATE;
BEGIN

SELECT SOME_DATE INTO ENDDATE FROM HEADER WHERE ID=1182446;

IF ENDDATE >= TO_DATE('18-MAY-13') THEN
  EXECUTE SOMEPROCEDURE(1182446);
END IF;

END;

Error report -
ORA-06550: line 8, column 8:
PLS-00103: Encountered the symbol "SOMEPROCEDURE" when expecting one of the following:

   := . ( @ % ;
The symbol ":=" was substituted for "SOMEPROCEDURE" to continue.
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
由于您是在一个匿名PL/SQL块中调用该过程,因此不需要执行
命令,因为它是一个SQL*Plus命令,而不是PL/SQL

您可以简单地将该过程称为:

IF ENDDATE >= TO_DATE('18-MAY-13') THEN
  SOMEPROCEDURE(1182446);
END IF;
如果希望在SQL*Plus中单独执行该过程,则可以使用executeEXEC命令

比如说,

在SQL*Plus中:

SQL> CREATE OR REPLACE
  2  PROCEDURE get_emp(
  3      emp_no IN emp.empno%type,
  4      dept_no OUT emp.deptno%type )
  5  AS
  6  BEGIN
  7    SELECT deptno INTO dept_no FROM emp WHERE empno = emp_no;
  8  END;
  9  /

Procedure created.

SQL> var dno number
SQL>  var eno number
SQL> exec :eno := 7369

PL/SQL procedure successfully completed.

SQL> EXEC get_emp(:eno, :dno);

PL/SQL procedure successfully completed.

SQL> print dno

       DNO
----------
        20

SQL>
SQL> set serveroutput on
SQL> DECLARE
  2    dt      DATE;
  3    dept_no NUMBER;
  4  BEGIN
  5    SELECT hiredate INTO dt FROM emp WHERE empno = 7369;
  6    IF dt < SYSDATE THEN
  7      get_emp(7369, dept_no);
  8      DBMS_OUTPUT.PUT_LINE('Department number is '||dept_no);
  9    END IF;
 10  END;
 11  /
Department number is 20

PL/SQL procedure successfully completed.
如果要在另一个PL/SQL块内调用该过程,可以按以下方式执行:

匿名PL/SQL块:

SQL> CREATE OR REPLACE
  2  PROCEDURE get_emp(
  3      emp_no IN emp.empno%type,
  4      dept_no OUT emp.deptno%type )
  5  AS
  6  BEGIN
  7    SELECT deptno INTO dept_no FROM emp WHERE empno = emp_no;
  8  END;
  9  /

Procedure created.

SQL> var dno number
SQL>  var eno number
SQL> exec :eno := 7369

PL/SQL procedure successfully completed.

SQL> EXEC get_emp(:eno, :dno);

PL/SQL procedure successfully completed.

SQL> print dno

       DNO
----------
        20

SQL>
SQL> set serveroutput on
SQL> DECLARE
  2    dt      DATE;
  3    dept_no NUMBER;
  4  BEGIN
  5    SELECT hiredate INTO dt FROM emp WHERE empno = 7369;
  6    IF dt < SYSDATE THEN
  7      get_emp(7369, dept_no);
  8      DBMS_OUTPUT.PUT_LINE('Department number is '||dept_no);
  9    END IF;
 10  END;
 11  /
Department number is 20

PL/SQL procedure successfully completed.
SQL>打开服务器输出
SQL>声明
2日;
3部门编号;
4开始
5从emp中选择hiredate进入dt,其中empno=7369;
6如果dt<系统日期,则
7获得环境管理计划(7369,部门编号);
8 DBMS|U输出。PUT|U行('部门编号为'| |部门编号);
9如果结束,则结束;
10结束;
11  /
部门号码是20
PL/SQL过程已成功完成。

过程名称前面不需要
EXECUTE
。只需删除
EXECUTE
。请参阅@LalitKumarB的答案。@Kyrie
EXECUTE
是一个
SQL*Plus
命令,而不是
PL/SQL
命令。