从过程中调用数据

calling data from procedure

嗨,我不确定我做错了什么。我正在尝试 display/return 我创建的过程中的所有记录。 Table 结构是 DD_PROJECT 和下面的 IDPROJ, PROJNAME,PROJSTART,PROJEND,PROJGOAL,PROJ COORD。我需要帮助根据指定的项目 ID 提取该信息。无论如何,这是我目前的代码:

     create or replace procedure DDPROJ_SP(p_proj_id DD_PROJECT.IDPROJ%type, p_proj_rec out DD_PROJECT%rowtype)
 is 
 begin 
 select *
 into p_proj_rec
 from DD_PROJECT
 where DD_PROJECT.IDPROJ=p_proj_id;

exception
 when others then
 p_proj_rec.idproj:=-1;
 end;

现在我正在尝试使用以下代码调用该过程:

set serveroutput on
DECLARE
 p_proj_id :=& proj_id;

BEGIN
  DDROJ_SP(p_proj_id);
DBMS_OUTPUT.PUT_LINE(
'Project ID: ' || p_proj_rec.projid 
||' Project Name: ' || p_proj_rec.projname 
||' Project Start Date: ' || p_proj_rec.projstartdate 
||' Project End Date: ' || p_proj_rec.projenddate
||' Project Fund Goal: ' ||  p_proj_rec.projfundgoal 
||' Project Coor: ' ||  p_proj_rec.projcoord 
);

end;

这是错误: 错误报告 - ORA-06550:第 2 行,第 12 列: PLS-00103:遇到符号“=”

此时我希望用户输入一个项目Id并在上面的输出代码中提取信息。

Error report - ORA-06550: line 2, column 12: PLS-00103: Encountered the symbol "="

问题#1

那是因为在匿名块的第 2 行中您声明了变量而没有提及它是 DATA TYPE。你可以这样做:

set serveroutput on
DECLARE
   p_proj_id DD_PROJECT.IDPROJ%TYPE; -- Data type
BEGIN
   p_proj_id :=& proj_id;

问题#2

DDROJ_SP(p_proj_id);

您还需要声明 p_proj_rec 您在过程中用作 OUT 参数。

您的要求很简单,您可以使用 REFCURSOR 来完成。要打印该行,您可以在 SQL*Plus.

中使用 print 命令

例如,

SQL> CREATE OR REPLACE
  2  PROCEDURE p_rec(i_empno emp.empno%TYPE,
  3      emp_rec OUT sys_refcursor)
  4  IS
  5  BEGIN
  6    open emp_rec for select * FROM scott.emp where empno = i_empno;
  7  END p_rec;
  8  /

Procedure created.

SQL>
SQL> sho err
No errors.
SQL>
SQL> variable emp_rec refcursor
SQL>
SQL> BEGIN
  2    p_rec(7369, :emp_rec);
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>
SQL> print emp_rec;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

SQL>

理想情况下,您甚至不需要程序,只需将 empno 作为输入即可。

您可以只定义输入,或提示输入值,打开光标并打印记录:

SQL> variable r refcursor
SQL> define i_empno=7369
SQL>
SQL> BEGIN
  2    OPEN :r FOR SELECT * FROM emp WHERE empno = &i_empno;
  3  END;
  4  /
old   2:   OPEN :r FOR SELECT * FROM emp WHERE empno = &i_empno;
new   2:   OPEN :r FOR SELECT * FROM emp WHERE empno = 7369;

PL/SQL procedure successfully completed.

SQL>
SQL> print r;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

SQL>

您错过了变量类型:

SET SERVEROUTPUT ON
DECLARE
  p_proj_id dd_project.idproj%TYPE :=& proj_id;
  p_proj_rec dd_project%rowtype;
BEGIN
  DDROJ_SP(p_proj_id,p_proj_rec);
  DBMS_OUTPUT.PUT_LINE('Project ID: ' || p_proj_rec.projid 
                       ||' Project Name: ' || p_proj_rec.projname 
                       ||' Project Start Date: ' || p_proj_rec.projstartdate 
                       ||' Project End Date: ' || p_proj_rec.projenddate
                       ||' Project Fund Goal: ' ||  p_proj_rec.projfundgoal 
                       ||' Project Coor: ' ||  p_proj_rec.projcoord 
                       );

END;