12

私は過去にこれについての議論を見たことがあります。しかし、おそらく10gまたは11g(11gを使用)のどこかで、ORACLEは、データベースにあらゆる種類のユーザー定義タイプや/を散らかす必要なしに、「パラメーター化されたビュー」のより良いサポートを導入したのではないかと思います。またはカーソル定義またはsys_context変数全体。

次のT-SQLの例のように、単に「正しく機能する」ものに対するORACLEの追加サポートを期待しています。

CREATE FUNCTION [dbo].[getSomeData] (@PRODID ROWID)  
RETURNS TABLE AS  
    RETURN SELECT PRODID, A, B, C, D, E  
    FROM MY_TABLE  
    WHERE PRODID = @PRODID

次に、そのように選択します。

SELECT * FROM dbo.getSomeData(23)
4

3 に答える 3

19

SYS_CONTEXTまたはカーソル定義は必要ありません。SQLが解析されるときに、返される列を判別できるように、型が必要です。そうは言っても、user_tab_columnsのデータに基づいて、1つ以上のテーブルの型とコレクション型の定義を生成するスクリプトを簡単に作成できます。

最も近いのは

create table my_table
(prodid number, a varchar2(1), b varchar2(1), 
  c varchar2(1), d varchar2(1), e varchar2(1));

create type my_tab_type is object
(prodid number, a varchar2(1), b varchar2(1), 
  c varchar2(1), d varchar2(1), e varchar2(1))
.
/

create type my_tab_type_coll is table of my_tab_type;
/

create or replace function get_some_data (p_val in number) 
return my_tab_type_coll pipelined is
begin
  FOR i in (select * from my_table where prodid=p_val) loop
    pipe row(my_tab_type(i.prodid,i.a,i.b,i.c,i.d,i.e));
  end loop;
  return;
end;
/

SELECT * FROM table(get_Some_Data(3));
于 2010-01-13T21:49:53.927 に答える
3

Oracleで一種の「パラメータ化された」ビューを定義することができます。手順は次のとおりです。

  1. 実際に必要なパラメーターであるパブリックメンバーとしてパッケージを定義します(そのパッケージには関数やプロシージャは必要ありません)。
  2. そのパッケージメンバーに基づくビューを定義します。

このメカニズムを使用するには、1人のユーザーが次のことを行う必要があります。

  1. セッションを開き、
  2. そのパッケージメンバーに必要な値を割り当て、
  3. SELECTビューからのデータ、
  4. 他のことをするか、セッションを閉じます。

備考:パッケージメンバースコープは正確にセッションであるため、ユーザーは1つのセッションで3つのステップすべてを実行することが不可欠です。

于 2012-02-02T12:02:52.190 に答える
-2

SQL SERVERには、次の2種類のテーブル値関数があります。

  1. インラインテーブル値関数:インラインテーブル値関数の場合、関数本体はありません。テーブルは、単一のSELECTステートメントの結果セットです。このタイプは「パラメータ化されたビュー」と名付けることができ、私が知っているように、ORACLEには同等のものがありません。

  2. マルチステートメントテーブル値関数:マルチステートメントテーブル値関数の場合、BEGIN...ENDブロックで定義された関数本体には、返される行を作成してテーブルに挿入する一連のTransact-SQLステートメントが含まれます。

上記のサンプル(Gary Myersによる)は、2番目のタイプのテーブル関数を作成しますが、これは「パラメーター化されたビュー」ではありません。

于 2011-10-27T12:33:41.223 に答える