1

私はオラクルを初めて使用し、さまざまな条件に基づいてさまざまなデータを選択する複雑なストアド プロシージャを作成します。ストアド プロシージャを実行できません。次のエラーが発生します。

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

この問題を解決するのを手伝ってください。

編集:スタックトレースが追加されました。

4

2 に答える 2

1

警告メッセージは、次のような式を含む文字列によって発生します。

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

パーセント記号を追加する理由 それらを削除し、手順を再作成して有効にしてください。

于 2013-03-22T10:45:11.060 に答える
1

少なくとも 1 つの問題は、次の行を読むことです。

ELSE
  IF customerId = 'All' then

これは

ELSIF customerId = 'All' then

ELSE IFこのコードに が他にもあるかどうかは確認しませんでした。存在する場合は、それらを修正して再コンパイルします。

共有してお楽しみください。

于 2013-03-22T11:00:27.937 に答える