1

Oracleのテーブルからすべてのデータを取得するために、単純なselectステートメントを実行しようとしています。進行中のプロジェクトの性質上、テーブルは常に更新および変更されているため、堅実な設計はありません。

私は簡単な声明を探しています。これだけで十分です。

Select * from myVariable

検索した後、これをコンパイルしました

create or replace procedure "GET_TABLEINFO" (o_rc OUT sys_refcursor, inTableName IN varchar2) AS       

BEGIN
      execute immediate 
          'SELECT * FROM '||inTableName
      using inTableName;
  END;

しかし、それをデータテーブルに追加しようとすると:

using (OracleConnection cn = new OracleConnection(connectionString))
        {
            OracleDataAdapter da = new OracleDataAdapter();
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = cn;
            cmd.InitialLONGFetchSize = 1000;
            cmd.CommandText = "GET_TABLEINFO";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("o_rc", OracleDbType.RefCursor, ParameterDirection.Output);
            cmd.Parameters.Add("inTable", OracleDbType.Varchar2, 60, inTableName, ParameterDirection.Input);

            da.SelectCommand = cmd;
            da.Fill(dt);

私はこれを得る

編集:

カーソルの設定方法がわかりません(初めてOracleを使用する場合、通常はSQLSERVERを使用します)。手順は簡単である必要があります。テーブル名を渡し、そのテーブルからデータを取得する必要があります。空想も、where句もありません。

ORA-01006: バインド変数が存在しません ORA-06512: "ODS_DEV.GET_TABLEINFO"、4 行目 ORA-06512: 1 行目

4

2 に答える 2

3

テーブル名 (および列名) をバインド変数にすることはできません。おそらく、作成した SQL ステートメントを使用してカーソルを開く必要もありますo_rc。ストアドプロシージャは次のようにする必要があります

create or replace procedure GET_TABLEINFO (
  o_rc OUT sys_refcursor, 
  inTableName IN varchar2) 
AS       
BEGIN
  OPEN o_rc
   FOR 'SELECT * FROM '||inTableName;
END;

もちろん、これにより、システムは SQL インジェクション攻撃に対して非常に脆弱になります。少なくとも、余分なdbms_assert呼び出しをスローする必要があります

create or replace procedure GET_TABLEINFO (
  o_rc OUT sys_refcursor, 
  inTableName IN varchar2) 
AS       
BEGIN
  OPEN o_rc
   FOR 'SELECT * FROM '|| dbms_assert.sql_object_name( inTableName );
END;
于 2013-01-30T20:56:24.303 に答える
2
CREATE OR REPLACE PROCEDURE GET_TABLEINFO(o_rc OUT sys_refcursor, inTableName IN varchar2) AS       
    sqlquery VARCHAR2(32000);
BEGIN
    sqlquery := 'SELECT * FROM ' || inTableName;
    OPEN o_rc FOR sqlquery;
END;
于 2013-01-30T20:54:04.713 に答える