【问题标题】:Oracle PLS-00428: an INTO clause is expected in this SELECT statementOracle PLS-00428:此 SELECT 语句中需要一个 INTO 子句
【发布时间】:2017-08-31 16:32:50
【问题描述】:

我编写了这个查询来模拟传递给服务器端查询的变量,它一直给我这个错误“ORA-06550:第 11 行,第 2 列: PLS-00428:此 SELECT 语句中需要一个 INTO 子句 ”。

这是我的查询

DECLARE

    P_CONTRACTS VARCHAR(60) := NULL;
    P_START_DATE  DATE:='01/01/2010';
    P_END_DATE  DATE:='05/01/2010';
    P_CONTRACT_TYPE  VARCHAR(30):='Annual';
    P_CONTRACT_STATUS  VARCHAR(30):='OPEN';

BEGIN

 SELECT DISTINCT

       CONTRACT_ID,
       SUPPLIER_NAME,
       CONTRACT_NUMBER,
       CONTRACT_TYPE,
       CONTRACT_STATUS,
       CONTRACT_DATE,
       MONTHLY_COMMITTED_LBS,
       PO,
       ORDER_TYPE,
       PRICING_TYPE,
       PURCHASE_VOLUME,
       RECEIVED_VOLUME,
       INTRANSIT,
       (MONTHLY_COMMITTED_LBS - (RECEIVED_VOLUME + INTRANSIT)) AS "NOT_SCHEDULED"

    FROM
            (
                SELECT DISTINCT
                    ARR.ID AS CONTRACT_ID,
                    DWPO.SUPPLIER_NAME AS SUPPLIER_NAME,
                    ARRANGEMENT_NUMBER AS CONTRACT_NUMBER,
                    DECODE(ARR.CONTRACT_DESIGNATION, 1, 'ANNUAL', 2, 'MINI-SPOT') AS CONTRACT_TYPE,
                    DECODE(ARR.STATUS, 1, 'OPEN', 2, 'CLOSED', 3, 'CANCELLED') AS CONTRACT_STATUS,
                    TO_CHAR(TRUNC(LAST_DAY(ADD_MONTHS(ARR.START_DATE,-1))+1), 'MM/DD/YYYY') AS CONTRACT_DATE,
                    ARRB.QUANTITY AS MONTHLY_COMMITTED_LBS,
                    P.PO_NUMBER AS PO,
                    DWPO.PO_TYPE AS ORDER_TYPE,
                    DWPO.PRICE_CALCULATION_TYPE AS PRICING_TYPE,
                    NVL(DW_REPORTS_PKG.GET_RECEIVED_BY_PO(P.PO_NUMBER, ARR.START_DATE, ARR.END_DATE, DWPO.PRODUCT_ID),0) AS "PURCHASE_VOLUME",
                    NVL(DW_REPORTS_PKG.GET_RECEIVED_WEIGHT_BY_PO(P.PO_NUMBER, ARR.START_DATE, ARR.END_DATE, DWPO.PRODUCT_ID),0) AS "RECEIVED_VOLUME",
                    NVL(DW_REPORTS_PKG.GET_IN_TRANSIT_BY_PO(P.PO_NUMBER, ARR.START_DATE, ARR.END_DATE, DWPO.PRODUCT_ID),0) AS "INTRANSIT"

                FROM
                    APP_ARRANGEMENT ARR
                        INNER JOIN APP_CONTRACT_SUPPLIER CS
                            ON (ARR.ID = CS.ARRANGEMENT_ID)
                        INNER JOIN APP_PO P
                            ON(P.ARRANGEMENT_ID = ARR.ID)
                        INNER JOIN DW_PURCHASE_ORDER DWPO
                            ON (DWPO.PO_NUMBER = P.PO_NUMBER)
                        INNER JOIN APP_ARRANGEMENT_BUCKET ARRB
                            ON (ARR.ID = ARRB.ARRANGEMENT_ID)
                WHERE
                        (
                                  (P_CONTRACTS IS NULL OR
                                  (ARR.ARRANGEMENT_NUMBER IN (SELECT * FROM (SELECT TRIM(SUBSTR(TXT, INSTR (TXT, ',', 1, LEVEL) + 1, INSTR(TXT, ',', 1, LEVEL+1) - INSTR (TXT, ',', 1, LEVEL) -1)) AS TOKEN
                                    FROM (SELECT ','|| P_CONTRACTS ||',' AS TXT FROM DUAL)
                                    CONNECT BY LEVEL <= LENGTH(TXT)-LENGTH(REPLACE(TXT,',',''))-1))))
                        )

                AND
                                (P_CONTRACT_TYPE IS NULL OR DECODE(ARR.CONTRACT_DESIGNATION, 1, 'ANNUAL', 2, 'MINISPOT') IN
                                (SELECT * FROM (SELECT TRIM(SUBSTR(TXT, INSTR (TXT, ',', 1, LEVEL) + 1, INSTR(TXT, ',', 1, LEVEL+1) - INSTR (TXT, ',', 1, LEVEL) -1)) AS TOKEN
                                 FROM (SELECT ','|| P_CONTRACT_TYPE ||',' AS TXT FROM DUAL)
                                 CONNECT BY LEVEL <= LENGTH(TXT)-LENGTH(REPLACE(TXT,',',''))-1)))

                 AND
                                (P_CONTRACT_STATUS IS NULL OR ARR.STATUS IN
                                (SELECT * FROM (SELECT TRIM(SUBSTR(TXT, INSTR (TXT, ',', 1, LEVEL) + 1, INSTR(TXT, ',', 1, LEVEL+1) - INSTR (TXT, ',', 1, LEVEL) -1)) AS TOKEN
                                FROM (SELECT ','|| P_CONTRACT_STATUS ||',' AS TXT FROM DUAL)
                                CONNECT BY LEVEL <= LENGTH(TXT)-LENGTH(REPLACE(TXT,',',''))-1)))
                AND
                                ((P_START_DATE IS NULL AND P_END_DATE IS NULL) OR TO_DATE(ARRB.MONTH || '/' || ARRB.YEAR, 'MM/YYYY') BETWEEN P_START_DATE AND P_END_DATE)

        );
END;

我可以提供与查询匹配的示例数据库结构和日期。

以防万一有人认为它与子查询有关,我可以运行子查询吗?对日期的硬编码值没有问题。

【问题讨论】:

  • 错误信息非常清楚:在 PL/SQL 中,如果不将结果存储在某处,就无法运行 SELECT。要存储结果,您需要一个 INTO 子句。详见手册:docs.oracle.com/cd/E11882_01/appdev.112/e25519/…
  • “查询”是一条 SQL 语句。任何以 BEGIN 开头的都是 PL/SQL 块(在您的情况下是“匿名”块)。块不是查询。你没有写查询;你写了一个 PL/SQL 匿名块。如果您想了解该问题,请不要阅读文档或 Google 以了解与 SQL 查询有关的内容 - 搜索“PL/SQL 匿名块”等类似内容。

标签: database oracle


【解决方案1】:

将您的查询声明为游标并继续编写您的 pl/sql 程序;)

声明 光标 c 是 选择不同的 .... ; 开始 -- 你的 PL/SQL 语句 结束;

【讨论】:

  • 你能详细说明你的答案吗?
猜你喜欢
  • 2021-12-10
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
相关资源
最近更新 更多