我想写两个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;
/

我还建议再看看INOUT 参数是如何工作的,因为您以错误的方式使用它们。但这将是一个完全不同的话题。 :-)

要将光标行传递给过程,您可以发送记录: 例如:

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程序。在一个过程中获取数据并从第二个过程中打印出来的主要内容,如果未能解决你的问题,请参考以下文章

从用户那里获取 2 个输入并在 PLSQL 中调用过程

如何从 plsql 函数创建和返回游标?

PLSQL 过程在运行时获取用户输入

PLSQL 过程中的查询必须返回 1 行,但返回更多行

用于截断和重新填充表的 PLSQL 过程

存储过程,并从两个几乎相同的视图中选择