2017-03-03 15 views
-2

私は主に.NETプログラマであり、時々MS SQL Serverストアドプロシージャをビルドします。Oracle 12で選択ストアドプロシージャを構築します。

私は1つのまたは多くのパラメータに基づいて、いくつかのレコードを選択して返すためにオラクルの手順を構築する必要があります。私はすでに1つをビルドしようとしましたが、欲求不満で停止しました。ここで

は私が作りたいものの例である:

CREATE OR REPLACE PROCEDURE P_TS_COLLISIONS_SEARCH(
     county IN VARCHAR2, 
     township IN VARCHAR2, 
     col_MRN IN VARCHAR2, 
     answer OUT VARCHAR2) 

AS 
BEGIN 
    SELECT COLLISION_MASTER_RECORD_NUMBER, CITY, ROAD_NAME 
     INTO answer 
     FROM DWOBDEV.OBIEE_TS_COLLISION_FACT_VW 
    WHERE COLLISION_MASTER_RECORD_NUMBER = col_MRN 
    AND TOWNSHIP = township 
    AND COUNTY = county; 

END P_TS_COLLISIONS_SEARCH; 

私はこれらのエラーを取得:

エラー(9,5):PL/SQL:SQLステートメントは無視エラー(11 、7):PL/SQL: ORA-00947:値が不十分です

これをOracle 12でどのように構築しますか?

+0

この質問は、何の努力や研究を示していません。ここから始めましょう。 https://www.google.com/search?q=how+to+create+a+stored+procedure+in+oracle+with+parameters&ie=utf-8&oe=utf-8 –

+3

クエリを実行してみましょう手順; 3列の結果が得られます。あなたのプロシージャでは、これらの3つの値を1つのスカラ変数の中に入れようとしているので、クエリが複数の行を与える場合、スカラー変数は結果をホストするのに十分ではないことに注意してください。 – Aleksej

+0

結果をプロンプトに返すクエリが必要な場合は、次のようにしてください:http://stackoverflow.com/a/40360471/230471 –

答えて

1

あなたにはいくつか問題があります。

  • 1つの列に3つの列を選択しています。これを使用して単一の行を返す場合は、選択した変数の数と列の数を一致させる必要があります。
  • 結果にidを選択していますが、すでに入力値として使用しています。それを再選択することは冗長です。
  • また、既にIDを渡しているようですが、これがPKであるかどうかは不明です。そうであれば、追加の値を照会する必要はありません。特定の行を取得するために単一のID引数を渡し、他の列値に一致する他の引数を取るために追加のprocを渡すだけでは、ちょっと意味があります。ここで

働くあなたのPROCのバージョンです。複数の行を返す場合は、代わりにカーソルを返すように変更する必要があります。例を見つけるには、documentation/web検索を使用してください。

create table OBIEE_TS_COLLISION_FACT_VW 
(collision_master_record_number number, 
county varchar2(50), 
township varchar2(50), 
city varchar2(50), 
road_name varchar2(50)); 

insert into obiee_ts_collision_fact_vw values (1, 'WINCHESTER',  'SPRINGFIELD', 'MOSCOW', 'STATION'); 

CREATE OR REPLACE PROCEDURE P_TS_COLLISIONS_SEARCH(
    county IN VARCHAR2, 
    township IN VARCHAR2, 
    col_MRN IN VARCHAR2, 
    city_o OUT VARCHAR2, 
    road_name_o OUT VARCHAR2) 
AS 
BEGIN 
    SELECT CITY, ROAD_NAME 
     INTO city_o, road_name_o 
     FROM OBIEE_TS_COLLISION_FACT_VW 
    WHERE COLLISION_MASTER_RECORD_NUMBER = col_MRN 
    AND TOWNSHIP = township 
    AND COUNTY = county; 

END P_TS_COLLISIONS_SEARCH; 

declare 
    l_id number := 1; 
    l_township VARCHAR2(50) := 'TOWNSHIP'; 
    l_county VARCHAR2(50) := 'COUNTY'; 
    l_city varchar2(50); 
    l_road_name varchar2(50); 
begin 
    P_TS_COLLISIONS_SEARCH(l_county, l_township, l_id, l_city, l_road_name); 
    dbms_output.put_line(l_city||'|'||l_road_name); 
end; 
0

私はあなたが望む出力の種類を知らないが、多分このような推測のビット:私はp_と私のパラメータを前に付けている

create or replace procedure p_ts_collisions_search 
    (p_col_mrn obiee_ts_collision_fact_vw.collision_master_record_number%type 
    , p_township obiee_ts_collision_fact_vw.township%type 
    , p_county obiee_ts_collision_fact_vw.county%type) 
as 
    rc sys_refcursor; 
begin 
    open rc for 
     select collision_master_record_number 
      , city 
      , road_name 
     from obiee_ts_collision_fact_vw 
     where collision_master_record_number = p_col_mrn 
     and township = p_township 
     and county = p_county; 

    dbms_sql.return_result(rc); 
end; 

注意と区別するためにand township = townshipはあまり達成していないため、データベースの列。 (別の方法として、プロシージャ名にラベルを付けることもできます(例:p_ts_collisions_search.township)。)

ダミーデータ:

create view obiee_ts_collision_fact_vw 
as 
select 1 as collision_master_record_number 
    , 'London' as city 
    , 'Bond Street' as road_name 
    , 'West End' as township 
    , 'Lalaland' as county 
from dual; 

SQL * Plusでのデモ:クライアントは暗黙の結果を処理できるようにする必要があるよう

SQL> exec p_ts_collisions_search(1, 'West End', 'Lalaland'); 

PL/SQL procedure successfully completed. 

ResultSet #1 

COLLISION_MASTER_RECORD_NUMBER CITY ROAD_NAME 
------------------------------ ------ ----------- 
          1 London Bond Street 

しかし、それは、どこでも動作しません。

SQL> call p_ts_collisions_search(1, 'West End', 'Lalaland'); 
call p_ts_collisions_search(1, 'West End', 'Lalaland') 
    * 
ERROR at line 1: 
ORA-29478: Implicit result cannot be returned through this statement. 
ORA-06512: at "SYS.DBMS_SQL", line 2785 
ORA-06512: at "SYS.DBMS_SQL", line 2779 
ORA-06512: at "WILLIAM.P_TS_COLLISIONS_SEARCH", line 17 

また、結果セットをoutパラメータで明示的に返すこともできます。

create or replace procedure p_ts_collisions_search 
    (p_col_mrn obiee_ts_collision_fact_vw.collision_master_record_number%type 
    , p_township obiee_ts_collision_fact_vw.township%type 
    , p_county obiee_ts_collision_fact_vw.county%type 
    , p_results out sys_refcursor) 
as 
begin 
    open p_results for 
     select collision_master_record_number 
      , city 
      , road_name 
     from obiee_ts_collision_fact_vw 
     where collision_master_record_number = p_col_mrn 
     and township = p_township 
     and county = p_county; 
end; 

デモ:

SQL> var results refcursor 
SQL> set autoprint on 
SQL> exec p_ts_collisions_search(1, 'West End', 'Lalaland', :results); 

PL/SQL procedure successfully completed. 

COLLISION_MASTER_RECORD_NUMBER CITY ROAD_NAME 
------------------------------ ------ ----------- 
          1 London Bond Street 
+0

入力いただきありがとうございます!非常に役に立ちました! –

関連する問題