从程序调用数据

时间:2015-03-31 00:49:44

标签: plsql oracle11g

嗨,我不确定自己做错了什么。我试图显示/返回我创建的过程中的所有记录。表结构为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并在上面的输出代码中提取信息。

2 个答案:

答案 0 :(得分:4)

您错过了变量类型:

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;

答案 1 :(得分:2)

  

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

问题#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中的打印命令。

例如,

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作为INPUT。

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

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>