2017-11-08 19 views
-3

STORE_CODEが入力されると、dbをチェックインしてストアコードを削除します。 SOそのために、私はIDを確認してPL内のレコードを削除します。

PROCEDURE DELETE_STORE_INFO 
(
    P_STORE_CODE IN NVARCHAR2 
) 

    AS 

    BEGIN 

    UPDATE TBL_RRSOC_STORE_INFO set ISACTIVE = 'N' where STORE_CODE = P_STORE_CODE; 

    END DELETE_STORE_INFO; 

以下の通りである手順を書かれている。しかし、ここで何不足しているが、ユーザが間違ったstore_codeを入力し、それが行いますので、どのような操作をした場合にどのような

です。その部分で確認する方法は?

この段階ではCOUNTの作業はありません。

+1

ですから、渡された入力文字列が有効であるかどうかをチェックするためのロジックを構築します。あなたが期待しているフォーマットを知っていれば、削除ステートメント – XING

+0

@XINGでそれを使用する前にチェックを行うことができます:はい、どのフォーマットについて話していますか?列のデータ型? – BNN

+0

あなたの入力を 'NVARCHAR2'として渡しているので、あなたのコードにいくつかの特別なダブルバイト文字があることを示します。したがって、カラムは' NVARCHAR2'でなければなりません。あなたが有効であるかどうかを確認する入力文字列と照合したいあなたの 'STORE_CD'のフォーマット/パターンについて話しています – XING

答えて

1

あなたは、以前のSQL文によって影響を受けた行数を見つけるためにSQL%ROWCOUNTを使用したい:

PROCEDURE DELETE_STORE_INFO 
(
    P_STORE_CODE IN NVARCHAR2 
) 
AS 
BEGIN 
    UPDATE TBL_RRSOC_STORE_INFO 
    SET ISACTIVE = 'N' 
    WHERE STORE_CODE = P_STORE_CODE; 

    IF SQL%ROWCOUNT = 0 THEN 
    -- DBMS_OUTPUT.PUT_LINE('Store code does not exist.'); 
    RAISE_APPLICATION_ERROR(-20000, 'Store code does not exist.'); 
    END IF; 
END DELETE_STORE_INFO; 
/

あなたはSQLコンソールに出力するDBMS_OUTPUT.PUT_LINE(string)を使用することができます( PHPやJavaのような外部言語から呼び出す場合、出力は表示されず、SET SERVEROUTPUT OFFの場合はコンソールに表示されないことがあります)。

無効なものが発生した場合は、RAISE_APPLICATION_ERROR(error_code, error_message)を使用して例外を発生させることもできます。

代わりにあなたがOUTパラメータにステータスを返すことができます:

PROCEDURE DELETE_STORE_INFO 
(
    P_STORE_CODE IN NVARCHAR2, 
    O_STATUS  OUT NUMBER 
) 
AS 
BEGIN 
    UPDATE TBL_RRSOC_STORE_INFO 
    SET ISACTIVE = 'N' 
    WHERE STORE_CODE = P_STORE_CODE; 

    IF SQL%ROWCOUNT = 0 THEN 
    o_status := 0; 
    ELSE 
    o_status := 1; 
    END IF; 
END DELETE_STORE_INFO; 
/
+0

どれが1番目の答えか2番目の方が良いですか? – BNN

+0

@VVVVどちらも「より良い」ものではありません。成功したかどうかについての情報が必要だが、プログラムで(つまりデバッグのためだけに)その情報を処理できないようにしたい場合は、 'DBMS_OUTPUT'を使用できます。アイテムを削除しないとエラーが発生した場合は、 'RAISE_APPLICATION_ERROR'を使用します(ただし、スクリプト内のエラーを覚えておいてください)。スクリプトの後の部分で何かが削除されたかどうかを知りたければ(削除してもエラーではない)、outパラメータにステータスを返します。 – MT0

1

一般的にあなたの手続きのための契約は以下の通りです:発呼者はいくつかstore_codeを与え、手順はそのようなコードを持つアクティブな店がないことを保証します。発信者が間違ってstore_codeを返すとどうなりますか?それはそのような店がないことを意味します、それで契約は成就します。あなたは:)これ以上、

を何もしないはずです。しかし、あなたはアップデートがすぐに更新ステートメントの後

if sql%notfound then 
    dbms_output.put_line('There is no such store!'); 
end if; 

のようなものを追加することができ、記録を発見したかどうかを確認したい場合。

MTに特に

:単純なスクリプトを確認し

create table t$(id integer); 

insert into t$ values(1); 

set serveroutput on 

begin 
    update t$ set id = 2 where id = 1; 
    if sql%notfound 
    then dbms_output.put_line('#1: not found'); 
    else dbms_output.put_line('#1: found'); 
    end if; 
    update t$ set id = 4 where id = 3; 
    if sql%found then 
    dbms_output.put_line('#2: found'); 
    else dbms_output.put_line('#2: not found'); 
    end if; 
end; 
/

drop table t$; 

私の結果は

Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 

#1: found 
#2: not found 

PL/SQL procedure successfully completed 
+0

それは働くでしょう。ベストプラクティスは、そのような確認を公開する前に確認することです。上記のスクリプトを試してみてください。 –

0

ある何かmissunderstandはあなたの要求にあります:あなたはそれを削除したいと述べたが、中にコードを使用して、あなたはincativeとしてストアを更新しました。

ここでは両方の状況でproceureです。あなたは右のいずれかを選択します。

CREATE OR REPLACE PROCEDURE DELETE_STORE_INFO (P_STORE_CODE IN NVARCHAR2) AS 
    n_count number; 

BEGIN 

    select count(1) INTO n_count from TBL_RRSOC_STORE_INFO where STORE_CODE = p_store_code; 

    if n_count > 0 then 
     UPDATE TBL_RRSOC_STORE_INFO set ISACTIVE = 'N' where STORE_CODE = P_STORE_CODE; 

-- or for deletion 
-- DELETE TBL_RRSOC_STORE_INFO set ISACTIVE = 'N' where STORE_CODE = P_STORE_CODE; 
    else 
     DBMS_OUTPUT.PUT_LINE('the required store was not found'); 
    end if; 
END DELETE_STORE_INFO; 
関連する問題