2013-03-22 10 views
1

Oracle을 처음 사용하고 다른 조건을 기반으로 다른 데이터를 선택하는 복잡한 저장 프로 시저를 작성합니다. 내가 저장 프로 시저를 실행 할 수없는 오전, 그것은 다음과 같은 오류를 제공합니다oracle 저장 프로 시저를 실행할 수 없습니다.

내 코드는 아래와 같습니다
ORA-06550: line2, column 3: 
PLS-00905: object SAURAV.LOG_DETAIL is invalid 
ORA-06550: line 2, column 3: 
PL/SQL: Statement Ignored 
ORA-06512: at line 58 

:

CREATE OR REPLACE 
PROCEDURE LOG_DETAIL(
    startIndex IN INT 
    ,pageSize IN INT 
    ,branchId IN varchar2 
    ,customerId IN varchar2 
    ,fromDate IN DATE 
    ,toDate IN DATE 
    ,withDate IN INT 
    ,p_cursor OUT sys_refcursor 
    ) AS 
BEGIN 
IF withDate = 1 then 
     IF branchId = NULL then 
      IF customerId = 'All' then 
       OPEN p_cursor 
       FOR SELECT * FROM (
     SELECT ROW_NUMBER() OVER (
       ORDER BY id 
       ) AS MyRows 
      ,log_info.branch_id 
      ,branch_name 
      ,customer_id 
      ,in_time 
      ,out_time 
      ,date_time 
      ,ip 
      ,(
       SELECT COUNT(id) 
       FROM log_info 
       WHERE date_time BETWEEN fromDate || '%' AND toDate || '%' 
       ) AS RowNumber FROM log_info,branch_info 
     WHERE date_time BETWEEN fromDate || '%' AND toDate || '%' 
      AND branch_info.branch_id = log_info.branch_id 
     ) 
    WHERE MyRows BETWEEN startIndex AND startIndex + pageSize - 1; 
      ELSE 
      OPEN p_cursor 
      FOR SELECT * FROM (
     SELECT ROW_NUMBER() OVER (
       ORDER BY id 
       ) AS MyRows 
      ,log_info.branch_id 
      ,branch_name 
      ,customer_id 
      ,in_time 
      ,out_time 
      ,date_time 
      ,ip 
      ,(
       SELECT COUNT(id) 
       FROM log_info 
       WHERE customer_id = customerId 
        AND date_time BETWEEN fromDate || '%' 
         AND toDate || '%' 
       ) AS RowNumber 
     FROM log_info,branch_info 
     WHERE customer_id = customerId 
      AND date_time BETWEEN fromDate || '%' 
       AND toDate || '%' 
      AND log_info.branch_id = branch_info.branch_id 
     ) 
    WHERE MyRows BETWEEN startIndex 
      AND startIndex + pageSize - 1; 
END IF; 
ELSE 
    IF customerId = 'All' then 
     OPEN p_cursor 
     FOR SELECT * FROM (
    SELECT ROW_NUMBER() OVER (
      ORDER BY id 
      ) AS MyRows 
     ,log_info.branch_id 
     ,branch_name 
     ,customer_id 
     ,in_time 
     ,out_time 
     ,date_time 
     ,ip 
     ,(
      SELECT COUNT(id) 
      FROM log_info 
      WHERE branch_id = branchId 
       AND date_time BETWEEN fromDate || '%' 
        AND toDate || '%' 
      ) AS RowNumber 
    FROM log_info 
     ,branch_info 
    WHERE log_info.branch_id = branchId 
     AND date_time BETWEEN fromDate || '%' 
      AND toDate || '%' 
     AND branch_info.branch_id = log_info.branch_id 
    ) 
WHERE MyRows BETWEEN startIndex 
     AND startIndex + pageSize - 1; 
     ELSE 
     OPEN p_cursor 
     FOR SELECT * FROM (
    SELECT ROW_NUMBER() OVER (
      ORDER BY id 
      ) AS MyRows 
     ,log_info.branch_id 
     ,branch_name 
     ,customer_id 
     ,in_time 
     ,out_time 
     ,date_time 
     ,ip 
     ,(
      SELECT COUNT(id) 
      FROM log_info 
      WHERE branch_id = branchId 
       AND customer_id = customerId 
       AND date_time BETWEEN fromDate || '%' 
        AND toDate || '%' 
      ) AS RowNumber 
    FROM log_info 
     ,branch_info 
    WHERE log_info.branch_id = branchId 
     AND customer_id = customerId 
     AND date_time BETWEEN fromDate || '%' 
      AND toDate || '%' 
     AND log_info.branch_id = branch_info.branch_id 
    ) 
WHERE MyRows BETWEEN startIndex 
     AND startIndex + pageSize - 1; 
     END IF ; 
     END IF ; 
     ELSE 
     IF customerId = 'All' then 
      IF branchId = NULL then 
       OPEN p_cursor 
       FOR SELECT * FROM (
    SELECT ROW_NUMBER() OVER (
      ORDER BY id 
      ) AS MyRows 
     ,log_info.branch_id 
     ,branch_name 
     ,customer_id 
     ,in_time 
     ,out_time 
     ,date_time 
     ,ip 
     ,(
      SELECT COUNT(id) 
      FROM log_info 
      ) AS RowNumber 
    FROM log_info 
     ,branch_info 
    WHERE branch_ingo.branch_id = log_info.branch_id 
    ) 
WHERE MyRows BETWEEN startIndex 
     AND startIndex + pageSize - 1; 
     ELSE 
     OPEN p_cursor 
     FOR SELECT * FROM (
    SELECT ROW_NUMBER() OVER (
      ORDER BY id 
      ) AS MyRows 
     ,log_info.branch_id 
     ,branch_name 
     ,customer_id 
     ,in_time 
     ,out_time 
     ,date_time 
     ,ip 
     ,(
      SELECT COUNT(id) 
      FROM log_info 
      WHERE branch_id = branchId 
      ) AS RowNumber 
    FROM log_info 
     ,branch_info 
    WHERE log_info.branch_id = branchId 
     AND log_info.branch_id = branch_info.branch_id 
    ) 
WHERE MyRows BETWEEN startIndex 
     AND startIndex + pageSize - 1; 
     END IF ; 
     ELSE 
     IF branchId = NULL then 
     OPEN p_cursor 
     FOR SELECT * FROM (
    SELECT ROW_NUMBER() OVER (
      ORDER BY id 
      ) AS MyRows 
     ,log_info.branch_id 
     ,branch_name 
     ,customer_id 
     ,in_time 
     ,out_time 
     ,date_time 
     ,ip 
     ,(
      SELECT COUNT(id) 
      FROM log_info 
      WHERE customer_id = customerId 
      ) AS RowNumber 
    FROM log_info 
     ,branch_info 
    WHERE customer_id = customerId 
     AND branch_info.branch_id = log_info.branch_id 
    ) 
WHERE MyRows BETWEEN startIndex 
     AND startIndex + pageSize - 1; 
     ELSE 
     OPEN p_cursor 
     FOR SELECT * FROM (
    SELECT ROW_NUMBER() OVER (
      ORDER BY id 
      ) AS MyRows 
     ,log_info.branch_id 
     ,branch_name 
     ,customer_id 
     ,in_time 
     ,out_time 
     ,date_time 
     ,ip 
     ,(
      SELECT COUNT(id) 
      FROM log_info 
      WHERE customer_id = customerId 
       AND branch_id = branchId 
      ) AS RowNumber 
    FROM log_info 
     ,branch_info 
    WHERE customer_id = customerId 
     AND log_info.branch_id = branchId 
     AND log_info.branch_id = branch_info.branch_id 
    ) 
WHERE MyRows BETWEEN startIndex 
     AND startIndex || pageSize - 1; 
     END IF ; 
    END IF ; 
END IF ; 
END LOG_DETAIL; 

내가 다음 명령을 사용하여 프로 시저를 실행하고 있습니다 :

variable z refcursor; 
LOG_DETAIL(1,20,null,'All',null,null,0,z); 

을 다음 쿼리 실행 후 :

select * from all_errors where name='LOG_DETAIL' order by sequence 
나는 결과 다음있어

:

OWNER NAME   TYPE   SEQUENCE LINE POSITION  TEXT          ATTRIBUTE MESSAGE_NUMBER 
SAURAV LOG_DETAIL PROCEDURE 1 30 49 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 2 30 57 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 3 30 29 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 4 30 39 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 5 32 47 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 6 32 55 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 7 32 27 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 8 32 37 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 9 54 11 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 10 54 19 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 11 53 28 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 12 53 38 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 13 59 9 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 14 59 17 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 15 58 26 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 16 58 36 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 17 84 10 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 18 84 18 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 19 83 27 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 
SAURAV LOG_DETAIL PROCEDURE 20 83 37 PLW-07204: conversion away from column type may result in sub-optimal query plan WARNING 7204 

이 문제를 해결 도와주세요.

편집 : 스택 추적이 추가되었습니다.

date_time BETWEEN fromDate || '%' AND toDate || '%' 

왜 퍼센트 기호를 추가 :

+1

SAURAV 사용자로 절차를 만들었습니까? 다음으로 확인하십시오 :'select object_name, owner from all_objects object_name = 'LOG_DETAIL''. 그렇다면 귀하의 실행 문을 – JWK

+0

예 게시하고 오라클에 의해 제공되는 SQL 개발자를 통해 그것을 실행하려고합니다 동일한 연결 –

+0

@ JWK 쿼리 froom 커맨드 라인을 실행할 때 다음 결과 : OBJECT_NAME OWNER - ----------------------------- --------------------- --------- LOG_DETAIL SAURAV –

답변

1

경고 메시지는 표현을 포함하는 문자열에 의해 발생? 그것들을 제거하고 그것을 유효하게 만들기위한 절차를 다시 만들어보십시오.

+0

나는 그들을 제거했지만 여전히 절차를 실행할 수 없습니다. oracle에서 제공하는 sql 개발자 ide를 사용하여 실행하면 실행 블록에서 다음 구문이 나타납니다. *** BEGIN LOG_DETAIL(); 종료; *** –

+0

@Adittya - 지금 오류가 있습니까? (all_errors)? 절차가 유효합니까? 'user_objects에서 상태를 선택하십시오. 여기서 object_name = 'LOG_DETAIL'' –

+0

상태가 유효하지 않습니다. 어떻게 유효한 절차를 만들 수 있습니까? 그 이유는 무엇일까요 ?? –

1

적어도 하나의 문제는이

ELSIF customerId = 'All' then 

가이 코드에 ELSE IF의 더 이상 발생이 있는지 통과하지 않았다해야

ELSE 
    IF customerId = 'All' then 

을 읽을 줄입니다. 있다면, 수정하고 다시 컴파일하십시오.

공유하고 즐기십시오.

+0

어쩌면, 간단한 중첩 된 IF? –

+0

@Bob Jarvis 다른 다른 프로시 저는 동일한 if-else-if 구문으로 실행됩니다. –

+0

나는 당신이 실수 한 것이 좋습니다. 'ELSE IF'는 적어도 버전 11.1을 통해 PL/SQL 구문 오류입니다. 어떤 오라클 버전을 사용하고 있습니까? –

관련 문제