Plsql 从过程调用数据

Plsql 从过程调用数据,plsql,oracle11g,Plsql,Oracle11g,嗨,我不确定我做错了什么。我正在尝试显示/返回我创建的过程中的所有记录。表结构为DD_项目,包含以下IDPROJ、PROJNAME、PROJSTART、PROJEND、PROJGOAL、PROJ 库德。我需要帮助根据指定的项目ID提取该信息。无论如何,这是我目前的代码: create or replace procedure DDPROJ_SP(p_proj_id DD_PROJECT.IDPROJ%type, p_proj_rec out DD_PROJECT%rowtype) i

嗨,我不确定我做错了什么。我正在尝试显示/返回我创建的过程中的所有记录。表结构为DD_项目,包含以下IDPROJ、PROJNAME、PROJSTART、PROJEND、PROJGOAL、PROJ 库德。我需要帮助根据指定的项目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,并在上面的输出代码中提取信息

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

问题1

这是因为在匿名块的第2行中,您声明了变量,但没有提到它的数据类型。你可以这样做:

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

DDROJ_SPp_项目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>
错误报告-ORA-06550:第2行第12列:PLS-00103:遇到符号=

问题1

这是因为在匿名块的第2行中,您声明了变量,但没有提到它的数据类型。你可以这样做:

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

DDROJ_SPp_项目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;

您错过了变量类型:

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;

我的赋值需要一个过程,用户需要输入用户ID。你知道为什么我的invoke命令不能正常工作吗?那是因为你在声明变量时没有在第2行中提供数据类型。我已经解决了这个问题,但现在它说我没有声明变量。好像它没有调用我的程序。你认为我的调用有什么问题吗?我现在在上面的注释中发布了错误。是的,在您的代码块中,您只传递了一个参数,但是您的过程中有两个参数。因此,您也需要声明OUT参数。请参见我的回答中如何声明sys\u refcursor。顺便说一句,我仍然认为你的方法过于复杂了。无论如何,按照我说的那样声明另一个参数,您将看到它正在工作。准确地说,声明p_proj_rec。请将其标记为已回答,这也将帮助其他人。嗨,我尝试声明光标,但它仍然无法工作。我仍然得到一个关于必须声明变量的错误。我的赋值需要一个过程,用户需要输入用户ID。知道为什么我的invoke命令不能正常工作吗?这是因为在声明变量时,您没有在第2行中提供数据类型。我已经修复了这个问题,但现在它说我没有声明变量。好像它没有调用我的程序。你认为我的调用有什么问题吗?我现在在上面的注释中发布了错误。是的,在您的代码块中,您只传递了一个参数,但是您的过程中有两个参数。因此,您也需要声明OUT参数。请参见我的回答中如何声明sys\u refcursor。顺便说一句,我仍然认为你的方法过于复杂了。无论如何,按照我说的那样声明另一个参数,您将看到它正在工作。准确地说,声明p_proj_rec。请将其标记为已回答,这也将帮助其他人。嗨,我尝试声明光标,但它仍然无法工作。我仍然得到一个关于必须声明变量的错误。这缓解了我的编译错误,但是现在我得到了错误报告-ORA-06550:第4行,第3列:PLS-00201:标识符'DDROJ_SP'必须声明ORA-06550:第4行,第3列:PL/SQL:语句忽略ORA-06550:第5行,第42列:PLS-00201:标识符“P_PROJ_REC.PROJID”必须声明为ORA-06550:第5行,第3列:PL/SQL:忽略语句06550。00000-行%s,列%s:\n%s*原因:通常是PL/SQL编译错误*行动:我在我的程序中声明了这些东西?我不知道我打电话给你的时候做错了什么。我错过了消除编译错误的p_proj_rec记录,但是现在我得到了错误报告-ORA-06550:第4行,第3列:PLS-00201:标识符“DDROJ_SP”必须声明ORA-06550:第4行,第3列:PL/SQL:语句忽略ORA-06550:第5行,第42列:PLS-00201:标识符“p_proj_rec.PROJID”必须声明或
A-06550:第5行第3列:PL/SQL:语句忽略06550。00000-行%s,列%s:\n%s*原因:通常是PL/SQL编译错误*行动:我在我的程序中声明了这些东西?我不知道我打电话给你的时候做错了什么。我错过了项目记录