1

我正在寻找一个简单的选择语句来从 oracle 中的表中取回所有数据。由于正在进行的项目的性质,表格不断更新和更改,因此我没有任何可靠的设计。

我正在寻找一个简单的陈述。这就是我需要它做的所有事情。

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 回答