2017-12-04 5 views
0

new_idの値を返しますが、成功しません。どんな助け?カントが手動で生成したIDを返します

create or replace FUNCTION create_election (name  VARCHAR, 
          description VARCHAR, 
          type   VARCHAR, 
          subtype  VARCHAR, 
          started_at VARCHAR, 
          ended_at  VARCHAR) 
RETURN INT 
IS 
v_id int; 
BEGIN 
    INSERT INTO election VALUES ( 
      ( SELECT nvl(max(id)+1, 0) AS new_id FROM election) , 
      name, description, type, subtype, started_at, ended_at, 
      0, 0, 0 
) RETURNING new_id into v_id ; 
END; 

---更新--- ベストプラクティスに基づいてソリューションを選択します。ヘルプのThx。

+0

'select count(1)from election'は0(ゼロ)を返します。no_data_found例外が発生すると思います。 –

+0

挿入クエリが正しいです。問題は、SQLのみでは私はnew_idを得ることができない、私は検索したもののpl/sqlが必要です。しかし、didはurコメントを得る。 – Goamaral

+1

...リターンv_id;終わり; – tbone

答えて

1

SELECT nvl(max(id)+1, 0) AS new_id FROM electionのようなクエリを使用してIDを生成するのは悪い方法です。 2人以上のユーザーがこの機能を呼び出すたびに、重複した値が表示されます。

Oracleには、このためのシーケンスがあります。シーケンスは常に一意の値を生成します。まず、シーケンスを作成します。

create sequence election_seq; 

次に、あなたの機能でそれを使用します。

create or replace FUNCTION create_election (name  VARCHAR, 
          description VARCHAR, 
          type   VARCHAR, 
          subtype  VARCHAR, 
          started_at VARCHAR, 
          ended_at  VARCHAR) 
RETURN INT 
IS 
v_id int; 
BEGIN 
    v_id := election_seq.nextval; 
    INSERT INTO election VALUES 
    (v_id, name, description, type, subtype, started_at, ended_at, 0, 0, 0); 
END; 
+0

Thx私は複雑であると思ってシーケンスをかわすようにしていました。私がそれをやっていたやり方で私の問題の解決策を知りたいのは興味深いですが。 – Goamaral

+0

@Goamaralその他の回答を参照してください。すべてが効いているようだ。 – Dmitry

0

私はあなたが機能終了ENDの前に、この行が必要だと思う:

RETURN v_id; 

あなたはローカル変数v_idにデータを取得するが、関数から返すされていませんが。

1

あなたは

SELECT nvl(max(id)+1, 0) into v_id FROM election 

として挿入し、後に挿入し、見返りにv_idを使用する前に選択を追加する必要があります。

0
create or replace FUNCTION create_election (name  VARCHAR, 
          description VARCHAR, 
          type   VARCHAR, 
          subtype  VARCHAR, 
          started_at VARCHAR, 
          ended_at  VARCHAR) 
RETURN INT 
IS 
    v_id int; 
    new_id int; 
BEGIN 
    INSERT INTO election VALUES ( 
      nvl( (SELECT max(id)+1 AS new_id FROM election) ,1), 
      name, description, type, subtype, started_at, ended_at, 
      0, 0, 0 
) RETURNING new_id into v_id ; 

    return v_id; 
END; 
関連する問題