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