【问题标题】:Error Execution (22: 7): ORA-06550错误执行 (22: 7): ORA-06550
【发布时间】:2015-03-28 23:54:01
【问题描述】:

你好,我是学生,我是 oracle 的新手,我正在尝试一些东西,但是这个程序有问题,我没有找到它在哪里。我希望你能帮助我提前谢谢你..

错误信息: [错误] 执行 (23: 7):ORA-06550:第 1 行,第 7 列: PLS-00306:调用“URUNNOGEN”时参数的数量或类型错误 ORA-06550:第 1 行,第 7 列: PL/SQL:语句被忽略

create or replace procedure ariciaykut.URUNNOGEN
(KATA in NVARCHAR2,MARK in NVARCHAR2,URNO out NVARCHAR2)as 
K NVARCHAR2(3);
M NVARCHAR2(3);
U NUMBER;
BEGIN
K:=KATA;
M:=MARK;
U:=0;
    FOR U IN 1..999 LOOP
        IF U BETWEEN '-1'AND'10' THEN
            URNO:=K||'00'||U||M;
        ELSIF U BETWEEN '9'AND'99' THEN
            URNO:=K||'0'||U||M;
        ELSE
            URNO:=K||U||M;
            INSERT INTO ARICIAYKUT.PROGOSTER VALUES(URNO);
        END IF;
    END LOOP;
END;

调用线路:

EXEC ARICIAYKUT.URUNNOGEN('ICK','COC');

【问题讨论】:

    标签: oracle plsql oracle11g


    【解决方案1】:

    您缺少对该过程的一个论据。您定义了 3,但只在 EXEC 语句中指定了 2。

    【讨论】:

    • 我认为定义 out 是不符合程序的,不是吗?在我使用它的代码中,如何调用它?没有任何东西,我应该用''像null一样调用它吗?因为我想通过程序来填充这个区域。
    【解决方案2】:

    删除out变量并声明为局部变量

    create or replace procedure ariciaykut.URUNNOGEN
    (KATA in NVARCHAR2,MARK in NVARCHAR2)as 
    K NVARCHAR2(3);
    M NVARCHAR2(3);
    U NUMBER;
    Urno nvarchar2(100);
    BEGIN
    K:=KATA;
    M:=MARK;
    U:=0;
    FOR U IN 1..999 LOOP
        IF U BETWEEN -1 AND 9 THEN
            URNO:=K||'00'||U||M;
        ELSIF U BETWEEN 9 AND 99 THEN
            URNO:=K||'0'||U||M;
        ELSE
            URNO:=K||U||M;
    END IF;
            INSERT INTO ARICIAYKUT.PROGOSTER VALUES(URNO);
    
    END LOOP;
    END;
    

    【讨论】:

    • 编辑了答案,以便在检查条件后进行插入
    【解决方案3】:

    我解决了这样的问题,感谢所有想帮助我的人..

    create or replace procedure ariciaykut.URUNNOGEN2 (KATA in NVARCHAR2,MARK in NVARCHAR2)as 
    K NVARCHAR2(3);
    M NVARCHAR2(3);
    U NUMBER;
    BEGIN
    K:=KATA;
    M:=MARK;
        FOR U IN 1..999 LOOP
            IF U BETWEEN '-1'AND'9' THEN
               INSERT INTO ARICIAYKUT.PROGOSTER VALUES(K||'00'||U||M);
            ELSIF U BETWEEN '9'AND'99' THEN
                INSERT INTO ARICIAYKUT.PROGOSTER VALUES(K||'0'||U||M);
            ELSE
                INSERT INTO ARICIAYKUT.PROGOSTER VALUES(K||U||M);
            END IF;
        END LOOP;
    END;
    

    【讨论】:

      【解决方案4】:

      您将U 中的数值与字符串('-1', '10' 等)进行比较。这很可能最终会做一些你不想要的事情。您还指望数字到字符的默认转换按您的预期运行;你可能会感到惊讶。

      此外,您对变量和循环控制值使用了相同的名称 (U),这可能会引起一些混淆。 (循环内U 将引用循环控制值;循环外U 将引用变量)。我建议您重新编写程序以将数字与数字进行比较,并使用TO_CHAR 函数将数字转换为字符串,类似于以下内容:

      create or replace procedure ariciaykut.URUNNOGEN
          (KATA in NVARCHAR2,MARK in NVARCHAR2,URNO out NVARCHAR2)
      as 
          K NVARCHAR2(3);
          M NVARCHAR2(3);
      BEGIN
          K:=KATA;
          M:=MARK;
      
          FOR U IN 1..999 LOOP
              URNO := K || TO_CHAR(U, '009') || M;
      
              IF U >= 100 THEN
                  INSERT INTO ARICIAYKUT.PROGOSTER VALUES(URNO);
              END IF;
          END LOOP;
      END URUNNOGEN;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-22
        • 2015-08-24
        • 1970-01-01
        • 2018-06-12
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多