簡體   English   中英

第10行出現錯誤:PL / SQL:語句被忽略

[英]ERROR at line 10: PL/SQL: Statement ignored

我正在嘗試在oracle pl / sql上創建一個過程,但出現錯誤。

我的過程的代碼是:

CREATE OR REPLACE PROCEDURE PR_LISTA_CLI (cpf IN VARCHAR2, p_rc OUT SYS_REFCURSOR)
IS
  checkCpf NUMBER; 
BEGIN   

    SELECT COUNT(CPF_CLIENTE) INTO checkCpf FROM CLIENTE WHERE CPF_CLIENTE = cpf;

    IF (checkCpf > 0) THEN
      open p_rc
       for
        select 
            com.data_compra,
            lst.qde_produto, 
            prd.nome_produto, 
            prd.valor_produto * lst.qde_produto
        from cliente cli 
            inner join compra com on cli.cod_cliente = com.cod_cliente 
            inner join lista_produto lst on com.cod_compra = lst.cod_compra
            inner join produto prd on lst.cod_produto = prd.cod_produto
        WHERE cli.cpf_cliente = cpf
        order by com.data_compra asc;
    ELSE
        RAISE_APPLICATION_ERROR(-20999,'ERRO! Cpf não cadastrado!', FALSE);
    END IF;
END;

該過程創建成功,沒有錯誤。

但是我在調​​用它后得到了錯誤-CALL PR_LISTA_CLI(111111111);

ORA-00911: invalid character

請問如何解決?

謝謝!!!

您的編譯錯誤在第10行,這是您執行SELECT 除非您使用的是12.1或更高版本,並且希望使用新的隱式語句結果功能,否則除非有將結果提取到其中的內容(例如[BULK COLLECT] INTO子句),否則您不能在PL / SQL塊中具有SELECT語句。您正在使用SELECT語句打開游標。 假設您的查詢返回多行,並且您打算將游標返回給調用者,則可以執行以下操作

CREATE OR REPLACE PROCEDURE PR_LISTA_CLI (cpf IN VARCHAR2, p_rc OUT SYS_REFCURSOR)
IS
  vEXCEPTION EXCEPTION;
  checkCpf NUMBER; 
BEGIN   

    SELECT COUNT(CPF_CLIENTE) INTO checkCpf FROM CLIENTE WHERE CPF_CLIENTE = cpf;

    IF (checkCpf > 0) THEN
      open p_rc
       for
        select 
            com.data_compra,
            lst.qde_produto, 
            prd.nome_produto, 
            prd.valor_produto * lst.qde_produto
        from cliente cli 
            inner join compra com on cli.cod_cliente = com.cod_cliente 
            inner join lista_produto lst on com.cod_compra = lst.cod_compra
            inner join produto prd on lst.cod_produto = prd.cod_produto
        WHERE cli.cpf_cliente = cpf
        order by com.data_compra asc
    ELSE
        RAISE vEXCEPTION;
    END IF;
    EXCEPTION
    WHEN vEXCEPTION THEN
        RAISE_APPLICATION_ERROR(-20999,'ERRO! Cpf não cadastrado!', FALSE);
END;

現在,如果那是你在做什么

  • 由於不修改任何數據庫狀態,因此創建返回sys_refcursor的函數會更有意義。
  • 您定義的異常似乎沒有用。 您正在引發一個異常,然后捕獲該相同的異常而僅引發一個不同的異常。 vException中間人,刪除異常處理程序和vException變量,然后在您的ELSE子句中調用RAISE_APPLICATION_ERROR (假設首先在這種情況下拋出異常確實有意義)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM