2015-03-31 2 views
1

Привет, я не уверен, что я делаю неправильно. Я пытаюсь отобразить/вернуть все записи из процедуры, которую я создал. Структура таблицы составляет DD_PROJECT со следующим IDPROJ, PROJNAME,PROJSTART,PROJEND,PROJGOAL,PROJ COORD. Мне нужна помощь в том, чтобы вывести эту информацию на основе указанного идентификатора проекта. В любом случае, вот мой код до сих пор:вызов данных из процедуры

 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: встречается символ «=»

В этот момент я хочу, чтобы пользователь вводил идентификатор проекта и вытаскивал информацию в моем выходном коде выше.

ответ

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; 
+0

что облегчение моей ошибки компиляции, но теперь я получаю отчет Error - ORA-06550: строка 4, колонка 3: PLS-00201: идентификатор 'DDROJ_SP' должен быть объявлен ORA-06550: строка 4, колонка 3 : PL/SQL: Заявление игнорируется ОР-06550: строка 5, колонка 42: PLS-00201: идентификатор 'P_PROJ_REC.PROJID' должен быть объявлен ОР-06550: строка 5, столбец 3: PL/SQL: Заявление игнорируется 06550. 00000 - "строка% s, столбец% s: \ n% s" * Причина: Обычно ошибка компиляции PL/SQL. * Действие: Я объявил это в своей процедуре? Я не знаю, что я делаю неправильно в своем обращении. – Kenny

+0

Отредактировано. Я пропустил запись p_proj_rec – pablomatico

2

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

Выпуск № 1

Это происходит потому, что в строке 2 анонимного блока вы объявили переменную, не упоминая это TYPE DATA. Вы можете сделать это, как:

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 в качестве входных данных.

Вы можете просто определить ввод, или запрашивать значения, открыть курсор и напечатать записи:

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> 
+0

Моя задача требует процедуры и для ввода пользователем идентификатора пользователя. Любая идея, почему моя команда invoke работает неправильно? – Kenny

+0

Это потому, что вы пропустили, чтобы указать тип данных в строке 2 при объявлении переменной. –

+0

Я исправил это, но теперь он говорит, что я не объявлял переменные. Это похоже на то, что он не вызывает мою процедуру. Вы видите какие-либо проблемы с моим вызовом? Я добавил ошибку в комментариях выше. – Kenny

Смежные вопросы