帮我看下我写的格式,出错了

-一个大坑 2017-11-06 11:33:16

create or replace procedure P_TEST(E_APPNO IN VARCHAR2) is
MAIL1 VARCHAR2(200);
MAIL2 VARCHAR2(2000);
CNT NUMBER;

begin

SELECT COUNT(A.PEMPLID)
INTO CNT
FROM APP_PASSENGER A
WHERE A.PEMPLID IS NOT NULL
AND A.APPNO = E_APPNO;

IF CNT > 0 THEN
FOR X IN (SELECT A.PEMPLID
FROM APP_PASSENGER A
WHERE A.PEMPLID IS NOT NULL
AND A.APPNO = E_APPNO) LOOP
SELECT F_GetEmpByWebService(X.PEMPLID) INTO MAIL1 FROM DUAL;

select MAIL1,
substr(MAIL1,
instr(MAIL1, ',', 1, 2) + 8,
instr(MAIL1, ',', 1, 3) - instr(MAIL1, ',', 1, 2) - 9)
into MAIL1
from dual;


IF MAIL1 <> 'null' THEN
MAIL2 := MAIL2 || ',' || MAIL1;
END IF;

END LOOP;
MAIL2 := SUBSTR(MAIL2, 1);
END IF;

end P_TEST;
...全文
285 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
碧水幽幽泉 2017-11-06
  • 打赏
  • 举报
回复
优化下:去掉CNT查询的逻辑

CREATE OR REPLACE PROCEDURE P_TEST
(
E_APPNO IN  VARCHAR2(200),
  MAIL1  IN OUT VARCHAR2(200),
  MAIL2  IN OUT VARCHAR2(2000)
)
IS
V_MAIL1 VARCHAR2(200);
BEGIN
 
FOR X IN (SELECT PEMPLID
FROM APP_PASSENGER
WHERE APPNO =  E_APPNO
AND A.PEMPLID IS NOT NULL
)LOOP
     
      SELECT MAIL1,
             SUBSTR(MAIL1,
                    INSTR(MAIL1, ',', 1, 2) + 8,
                    INSTR(MAIL1, ',', 1, 3) - INSTR(MAIL1, ',', 1, 2) - 9)
        INTO MAIL1
        FROM DUAL;
     
      IF MAIL1 IS NOT NULL THEN      
        MAIL2 := MAIL2 || ',' || V_MAIL1;      
      END IF;
           
    END LOOP;  

    MAIL2 := SUBSTR(MAIL2, 1);  
 
END P_TEST;
碧水幽幽泉 2017-11-06
  • 打赏
  • 举报
回复
楼主,你是需要将MAIL1,MAIL2 既当做输入参数,又当做输出参数返回吗?
如果是的,代码如下:

CREATE OR REPLACE PROCEDURE P_TEST
(
E_APPNO IN  VARCHAR2(200),
  MAIL1  IN OUT VARCHAR2(200),
  MAIL2  IN OUT VARCHAR2(2000)
)
IS
V_MAIL1 VARCHAR2(200);
BEGIN
 
  SELECT COUNT(A.PEMPLID)
    INTO CNT
    FROM APP_PASSENGER A
   WHERE A.PEMPLID IS NOT NULL
     AND A.APPNO = E_APPNO;
 
FOR X IN (SELECT PEMPLID
FROM APP_PASSENGER
WHERE APPNO =  E_APPNO
AND A.PEMPLID IS NOT NULL
)LOOP
     
      SELECT MAIL1,
             SUBSTR(MAIL1,
                    INSTR(MAIL1, ',', 1, 2) + 8,
                    INSTR(MAIL1, ',', 1, 3) - INSTR(MAIL1, ',', 1, 2) - 9)
        INTO MAIL1
        FROM DUAL;
     
      IF MAIL1 IS NOT NULL THEN      
        MAIL2 := MAIL2 || ',' || V_MAIL1;      
      END IF;
           
    END LOOP;  

    MAIL2 := SUBSTR(MAIL2, 1);  
 
END P_TEST;
卖水果的net 2017-11-06
  • 打赏
  • 举报
回复
CNT 是一个 in 参数 最好 select count() into 新变量
碧水幽幽泉 2017-11-06
  • 打赏
  • 举报
回复
调整下,试试这个:

create or replace procedure P_TEST(E_APPNO IN VARCHAR2(200),
  MAIL1 VARCHAR2(200),
  MAIL2 IN OUT VARCHAR2(2000),
  CNT  IN OUT NUMBER
)
is
V_MAIL1 varchar2(200);
begin
 
  SELECT COUNT(A.PEMPLID)
    INTO CNT
    FROM APP_PASSENGER A
   WHERE A.PEMPLID IS NOT NULL
     AND A.APPNO = E_APPNO;
 
  IF CNT > 0 THEN  
    FOR X IN (SELECT A.PEMPLID
                FROM APP_PASSENGER A
               WHERE A.PEMPLID IS NOT NULL
                 AND A.APPNO = E_APPNO) LOOP
      SELECT F_GetEmpByWebService(X.PEMPLID) INTO MAIL1 FROM DUAL;
     
      select MAIL1,
             substr(MAIL1,
                    instr(MAIL1, ',', 1, 2) + 8,
                    instr(MAIL1, ',', 1, 3) - instr(MAIL1, ',', 1, 2) - 9)
        into V_MAIL1
        from dual;
 
     
      IF v_MAIL1<> 'null' THEN      
        MAIL2 := MAIL2 || ',' || v_MAIL1;      
      END IF;
           
    END LOOP;  
    MAIL2 := SUBSTR(MAIL2, 1);  
  END IF;
 
end P_TEST;
碧水幽幽泉 2017-11-06
  • 打赏
  • 举报
回复
试试这个:

create or replace procedure P_TEST(E_APPNO IN VARCHAR2(200),
  MAIL1 VARCHAR2(200),
  MAIL2 IN OUT VARCHAR2(2000),
  CNT   NUMBER
)
is
V_MAIL1 varchar2(200);
V_MAIL2 varchar2(2000);
begin
 
  SELECT COUNT(A.PEMPLID)
    INTO CNT
    FROM APP_PASSENGER A
   WHERE A.PEMPLID IS NOT NULL
     AND A.APPNO = E_APPNO;
 
  IF CNT > 0 THEN  
    FOR X IN (SELECT A.PEMPLID
                FROM APP_PASSENGER A
               WHERE A.PEMPLID IS NOT NULL
                 AND A.APPNO = E_APPNO) LOOP
      SELECT F_GetEmpByWebService(X.PEMPLID) INTO MAIL1 FROM DUAL;
     
      select MAIL1,
             substr(MAIL1,
                    instr(MAIL1, ',', 1, 2) + 8,
                    instr(MAIL1, ',', 1, 3) - instr(MAIL1, ',', 1, 2) - 9)
        into V_MAIL1
        from dual;
 
     
      IF v_MAIL1<> 'null' THEN      
        MAIL2 := MAIL2 || ',' || v_MAIL1;      
      END IF;
           
    END LOOP;  
    V_MAIL2 := SUBSTR(MAIL2, 1);  
  END IF;
 
end P_TEST;
-一个大坑 2017-11-06
  • 打赏
  • 举报
回复
错误提示 Compilation errors for PROCEDURE SENDCAR.P_TEST Error: PL/SQL: ORA-00909: invalid number of arguments Line: 22 Text: select COUNT(MAIL1, Error: PL/SQL: SQL Statement ignored Line: 22 Text: select COUNT(MAIL1, Error: Hint: Value assigned to 'MAIL2' never used in 'P_TEST' Line: 43 Text: MAIL2 := SUBSTR(MAIL2, 1);
-一个大坑 2017-11-06
  • 打赏
  • 举报
回复
引用 10 楼 qq646748739 的回复:
这帖子我在PC端看不到了,难道又被删除了?
我也看不到,只能看到通知有。既然解决了。我结贴的
碧水幽幽泉 2017-11-06
  • 打赏
  • 举报
回复
这帖子我在PC端看不到了,难道又被删除了?
-一个大坑 2017-11-06
  • 打赏
  • 举报
回复
引用 6 楼 qq646748739 的回复:
优化下:去掉CNT查询的逻辑

CREATE OR REPLACE PROCEDURE P_TEST
(
  E_APPNO IN       VARCHAR2(200),
  MAIL1   IN  OUT  VARCHAR2(200),
  MAIL2   IN  OUT  VARCHAR2(2000)
)
IS
   V_MAIL1  VARCHAR2(200);
BEGIN
 
  FOR X IN (SELECT PEMPLID
              FROM APP_PASSENGER
			 WHERE APPNO =  E_APPNO
			   AND A.PEMPLID IS NOT NULL
		    )LOOP
     
      SELECT MAIL1,
             SUBSTR(MAIL1,
                    INSTR(MAIL1, ',', 1, 2) + 8,
                    INSTR(MAIL1, ',', 1, 3) - INSTR(MAIL1, ',', 1, 2) - 9)
        INTO MAIL1
        FROM DUAL;
     
      IF MAIL1 IS NOT NULL THEN      
        MAIL2 := MAIL2 || ',' || V_MAIL1;      
      END IF;
           
    END LOOP;  

    MAIL2 := SUBSTR(MAIL2, 1);  
 
END P_TEST;
我改好了,看下还有什么需要优化的吗?

create or replace procedure P_TEST(E_APPNO IN VARCHAR2) is
  MAIL1 VARCHAR2(200);
  MAIL2 VARCHAR2(2000);
  CNT   NUMBER;

begin

  SELECT COUNT(A.PEMPLID)
    INTO CNT
    FROM APP_PASSENGER A
   WHERE A.PEMPLID IS NOT NULL
     AND A.APPNO = E_APPNO;

  IF CNT > 0 THEN
    FOR X IN (SELECT A.PEMPLID
                FROM APP_PASSENGER A
               WHERE A.PEMPLID IS NOT NULL
                 AND A.APPNO = E_APPNO) LOOP
      SELECT F_GetEmpByWebService(X.PEMPLID) INTO MAIL1 FROM DUAL;
    
      with tmp as
       (select MAIL1 str from dual)
      select substr(str,
                    instr(str, ',', 1, 2) + 8,
                    instr(str, ',', 1, 3) - instr(str, ',', 1, 2) - 9)
        into MAIL1
        from tmp
       group by str;
    
      IF MAIL1 <> 'null' THEN
        MAIL2 := MAIL2 || ',' || MAIL1;
      END IF;
    
    END LOOP;
  
    select substr(mail2, 1) into mail2 from dual;
  
  END IF;

end P_TEST;
-一个大坑 2017-11-06
  • 打赏
  • 举报
回复
引用 6 楼 qq646748739 的回复:
优化下:去掉CNT查询的逻辑

CREATE OR REPLACE PROCEDURE P_TEST
(
  E_APPNO IN       VARCHAR2(200),
  MAIL1   IN  OUT  VARCHAR2(200),
  MAIL2   IN  OUT  VARCHAR2(2000)
)
IS
   V_MAIL1  VARCHAR2(200);
BEGIN
 
  FOR X IN (SELECT PEMPLID
              FROM APP_PASSENGER
			 WHERE APPNO =  E_APPNO
			   AND A.PEMPLID IS NOT NULL
		    )LOOP
     
      SELECT MAIL1,
             SUBSTR(MAIL1,
                    INSTR(MAIL1, ',', 1, 2) + 8,
                    INSTR(MAIL1, ',', 1, 3) - INSTR(MAIL1, ',', 1, 2) - 9)
        INTO MAIL1
        FROM DUAL;
     
      IF MAIL1 IS NOT NULL THEN      
        MAIL2 := MAIL2 || ',' || V_MAIL1;      
      END IF;
           
    END LOOP;  

    MAIL2 := SUBSTR(MAIL2, 1);  
 
END P_TEST;

      SELECT MAIL1,

             SUBSTR(MAIL1,
                    INSTR(MAIL1, ',', 1, 2) + 8,
                    INSTR(MAIL1, ',', 1, 3) - INSTR(MAIL1, ',', 1, 2) - 9)
        INTO MAIL1
        FROM DUAL;
MAIL2 := SUBSTR(MAIL2, 1);
这两句报错了 Compilation errors for PROCEDURE SENDCAR.P_TEST Error: PL/SQL: ORA-00947: not enough values Line: 18 Text: FROM DUAL; Error: PL/SQL: SQL Statement ignored Line: 13 Text: SELECT MAIL1, Error: Hint: Value assigned to 'MAIL2' never used in 'P_TEST' Line: 26 Text: MAIL2 := SUBSTR(MAIL2, 1);
-一个大坑 2017-11-06
  • 打赏
  • 举报
回复
引用 5 楼 qq646748739 的回复:
楼主,你是需要将MAIL1,MAIL2 既当做输入参数,又当做输出参数返回吗? 如果是的,代码如下:

CREATE OR REPLACE PROCEDURE P_TEST
(
  E_APPNO IN       VARCHAR2(200),
  MAIL1   IN  OUT  VARCHAR2(200),
  MAIL2   IN  OUT  VARCHAR2(2000)
)
IS
   V_MAIL1  VARCHAR2(200);
BEGIN
 
  SELECT COUNT(A.PEMPLID)
    INTO CNT
    FROM APP_PASSENGER A
   WHERE A.PEMPLID IS NOT NULL
     AND A.APPNO = E_APPNO;
 
  FOR X IN (SELECT PEMPLID
              FROM APP_PASSENGER
			 WHERE APPNO =  E_APPNO
			   AND A.PEMPLID IS NOT NULL
		    )LOOP
     
      SELECT MAIL1,
             SUBSTR(MAIL1,
                    INSTR(MAIL1, ',', 1, 2) + 8,
                    INSTR(MAIL1, ',', 1, 3) - INSTR(MAIL1, ',', 1, 2) - 9)
        INTO MAIL1
        FROM DUAL;
     
      IF MAIL1 IS NOT NULL THEN      
        MAIL2 := MAIL2 || ',' || V_MAIL1;      
      END IF;
           
    END LOOP;  

    MAIL2 := SUBSTR(MAIL2, 1);  
 
END P_TEST;
不需要输入,也不需要输出 主要是把邮箱都统计出来然后插入到表中

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧