Plsql 从过程调用数据
嗨,我不确定我做错了什么。我正在尝试显示/返回我创建的过程中的所有记录。表结构为DD_项目,包含以下IDPROJ、PROJNAME、PROJSTART、PROJEND、PROJGOAL、PROJ 库德。我需要帮助根据指定的项目ID提取该信息。无论如何,这是我目前的代码: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
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编译错误*行动:我在我的程序中声明了这些东西?我不知道我打电话给你的时候做错了什么。我错过了项目记录