【问题标题】:Standalone Procedure Error in Cursor to a basic table游标中的独立过程错误到基本表
【发布时间】:2017-05-12 05:33:05
【问题描述】:

我正在尝试使用一个独立的外部过程从游标中运行,获取一个变量并将其返回到过程中,过程会将值插入到另一个表中。出现错误。

程序:

CREATE OR REPLACE PROCEDURE proc_test
(p_inn   newtable.totalhours%TYPE) AS

BEGIN
p_inn := p_inn - p_inn + 1;
INSERT INTO proceduretest (value)
VALUES (p_inn);
END proc_test;
/

带光标的代码

SET SERVEROUTPUT ON
DECLARE
        v_idno  paydata1.idno%TYPE;
        v_name  paydata1.name%TYPE;
        v_hrs   paytran1.hourswk%TYPE;
        v_hrsT  paytran1.hourswk%TYPE;
        v_code  paydata1.jobcode%TYPE;
        v_payh  paydata1.payhr%TYPE;
        v_sal   paydata1.salary%TYPE;
        v_OT    NUMBER(6,2);
        CURSOR payday IS
        SELECT idno, name FROM paydata1
        ORDER BY idno;
        CURSOR paytray IS
        SELECT hourswk FROM paytran1
        WHERE v_idno = idno
        ORDER BY idno;
        CURSOR total IS
        SELECT idno, name, jobcode, salary, payhr
        FROM paydata1
        WHERE v_idno = idno;
        BEGIN
        OPEN payday;
        LOOP
          FETCH payday INTO v_idno, v_name;
          EXIT WHEN payday%NOTFOUND;
          IF paytray%ISOPEN THEN
          CLOSE paytray;
          END IF;
           OPEN paytray;
           v_hrsT := 0;
           LOOP
            FETCH paytray INTO v_hrs;
            EXIT WHEN paytray%NOTFOUND;
            v_hrsT := v_hrsT + v_hrs;
           END LOOP;
            OPEN total;
             FETCH total INTO v_idno, v_name, v_code, v_sal, v_payh;
             WHILE total%FOUND LOOP
              IF v_code = 'S' THEN
               v_sal := v_sal / 52;
               DBMS_OUTPUT.PUT_LINE(v_name || ' - Total hours worked is: ' ||  v_hrsT);
                proc_test (v_hrsT); <------------------

              ELSE
                IF v_hrsT > 40 THEN
                 v_OT := v_hrsT - 40;
                 v_OT := v_OT * (v_payh * 1.5);
                 v_OT := v_OT + (40 * v_payh);
                 v_sal := v_OT;
                ELSE
                 v_sal := v_hrsT * v_payh;
                END IF;



                 DBMS_OUTPUT.PUT_LINE(v_name || ' - Total hours worked is: ' || v_hrsT);
proc_test (v_hrsT); <---------------
END IF;
              FETCH total INTO v_idno, v_name, v_code, v_sal, v_payh;
             END LOOP;
            CLOSE total;
           CLOSE paytray;
          END LOOP;
         CLOSE payday;
END;
/
SET SERVEROUTPUT OFF

很抱歉,有些代码在最后变得混乱,但我已经在调用过程的位置画了箭头。

错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/1      PL/SQL: Statement ignored
5/1      PLS-00363: expression 'P_INN' cannot be used as an assignment
         target

【问题讨论】:

  • 您遇到了哪些错误?
  • 为什么三个游标从同一个表中选择,相互嵌套?
  • 供将来参考,这不是外部程序。 ExtProcs 是不同的东西。正确的术语是独立的。

标签: sql oracle logic procedures


【解决方案1】:

未定义方向的参数默认为 IN。我们不能分配(更改)IN 参数的值。你还没有定义 P_INN 的方向,所以默认是 IN,所以你不能这样做

p_inn := p_inn - p_inn + 1;

这就是错误消息告诉您的内容。

如果您不需要操作值来插入它以外的任何东西,那么就这样做......

CREATE OR REPLACE PROCEDURE proc_test
    (p_inn   newtable.totalhours%TYPE) AS    
BEGIN
    INSERT INTO proceduretest (value)
    VALUES (p_inn - p_inn + 1);
END proc_test;
/

否则使用局部变量:

CREATE OR REPLACE PROCEDURE proc_test
    (p_inn IN  newtable.totalhours%TYPE) 
AS    
    l_inn  newtable.totalhours%TYPE;
BEGIN
    l_inn := p_inn - p_inn + 1;
    INSERT INTO proceduretest (value)
    VALUES (l_inn);
END proc_test;
/

【讨论】:

  • 谢谢你,需要好好分析一下才能更好地理解这一点。
【解决方案2】:

你的过程需要两个参数,但你用一个来调用它。

编辑:更改后,您可以像使用变量一样使用参数。这仅允许用于 OUT 参数。无论如何,你的计算毫无意义。

为此,请像这样更改您的代码:

CREATE OR REPLACE PROCEDURE proc_test (p_inn IN OUT newtable.totalhours%TYPE) AS

【讨论】:

  • 即使只有一个我也会收到错误消息。更改了帖子中的程序以匹配我现在使用的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
相关资源
最近更新 更多