我想写两个plsql程序。在一个过程中获取数据并从第二个过程中打印出来
Posted
技术标签:
【中文标题】我想写两个plsql程序。在一个过程中获取数据并从第二个过程中打印出来【英文标题】:I want to write two plsql procedures. Get data in one procedure and print it from the second procedure 【发布时间】:2017-09-18 05:29:58 【问题描述】:我需要在一个过程中从表中获取值列表,然后将这些值传递给第二个过程。
例如。在A.prc
中,我需要从表中获取数据,在B.prc
中,我需要打印在A.prc
中获取的数据。
提前致谢
附: : 使用 Oracle 11g 作为 DB 和 sys priv 和 Toad 来写 prc 的
CREATE OR REPLACE PROCEDURE P1(
EMPNO OUT EMP.EMPNO%type,
ENAME OUT EMP.ENAME%type,
DEPTNO OUT EMP.DEPTNO%type)
AS
C_EMP SYS_REFCURSOR;
C_EM VARCHAR2(200);
BEGIN
C_EM:='SELECT EMPNO,ENAME,DEPTNO FROM EMP';
OPEN C_EMP FOR C_EM;
LOOP
FETCH C_EMP into EMPNO,ENAME,DEPTNO;
EXIT WHEN C_EMP%notfound;
END LOOP;
P2(C_EMP);
CLOSE C_EMP;
END;
/
CREATE OR REPLACE PROCEDURE P2(e_EMP SYS_REFCURSOR) AS
BEGIN
LOOP
FETCH e_EMP INTO E_EMPNO,E_ENAME,E_DEPTNO;
EXIT WHEN e_EMP%NOTFOUND;
END LOOP;
CLOSE e_EMP;
END;
/
错误:[错误] PLS-00306(17:4):PLS-00306:错误的数量或类型 调用“P2”的参数
更新 1:还需要在没有游标的情况下使用关联数组来执行此操作。 这是作业/家庭作业的一部分。 用数组试过这个:
CREATE OR REPLACE PROCEDURE P1
AS
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
BEGIN
SELECT * INTO emp_tab FROM emp;
END;
/
[错误] PLS-00597 (6: 15): PLS-00597: INTO 列表中的表达式“EMP_TAB”> 类型错误 [错误] ORA-00904 (6: 23): PL/SQL: ORA-00904: : 标识符无效
【问题讨论】:
我尝试过使用光标。我会将我的代码添加到描述中 【参考方案1】:你在正确的轨道上,但我认为它可以做得更简单一点。 我希望我的例子能让你知道如何解决它。 例如:
CREATE OR REPLACE PROCEDURE P2 (nId IN NUMBER, vName IN VARCHAR2)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('Output nId: ' || nId || ' vName: ' || vName);
END;
/
CREATE OR REPLACE PROCEDURE P1
AS
CURSOR c1 AS
SELECT Id, Name FROM TableA;
BEGIN
FOR r1 IN c1 LOOP
P2(nId => r1.Id, vName => r1.Name);
END LOOP;
END;
/
我还建议再看看IN
和OUT
参数是如何工作的,因为您以错误的方式使用它们。但这将是一个完全不同的话题。 :-)
要将光标行传递给过程,您可以发送记录: 例如:
CREATE OR REPLACE PROCEDURE P2 (r1 IN TableA%ROWTYPE)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('Output nId: ' || r1.nId || ' vName: ' || r1.vName);
END;
/
CREATE OR REPLACE PROCEDURE P1
AS
CURSOR c1 AS
SELECT Id, Name FROM TableA;
BEGIN
FOR r1 IN c1 LOOP
P2(r1 => r1);
END LOOP;
END;
/
【讨论】:
谢谢!我会尝试并更新。你能帮我在不使用光标但使用关联数组的情况下做同样的事情吗? 我在游标中更自在。 :-) 效果很好!但是,我的导师需要我将光标传递给第二个过程。所以这对我来说不是一个解决方案。感谢您的建议。 要将所有游标输出传递给另一个过程,您可以使用记录。我已经编辑了我的答案。我认为这是你的导师希望你做的。 太棒了!这样就彻底解决了!非常感谢您的帮助!以上是关于我想写两个plsql程序。在一个过程中获取数据并从第二个过程中打印出来的主要内容,如果未能解决你的问题,请参考以下文章