当前位置: 首页 > 知识库问答 >
问题:

中的Oracle参数。net sql查询-ORA-00933:sql命令未正确结束

丌官昊天
2023-03-14

我正在尝试创建一个where子句作为参数传递给Oracle命令,事实证明这比我想象的要困难得多。我想做的是根据应用程序中的用户输入创建一个大型where查询。其中query是语句的单个参数,并且将包含多个and、OR条件。但这里的代码并不完全符合我的要求:

string conStr = "User Id=testschema;Password=pass12341;Data Source=orapdex01";
Console.WriteLine("About to connect to Database with Connection String: " + conStr);
OracleConnection con = new OracleConnection(conStr);
con.Open();
Console.WriteLine("Connected to the Database..." + Environment.NewLine + "Press enter to continue");
Console.ReadLine();

// Assume the connection is correct because it works already without the parameterization
String block = "SELECT * FROM TEMP_VIEW WHERE NAME = :1";

// set command to create anonymous PL/SQL block
OracleCommand cmd = new OracleCommand();

cmd.CommandText = block;
cmd.Connection = con;

// since execurting anonymous pl/sql blcok, setting the command type
// as text instead of stored procedure
cmd.CommandType = CommandType.Text;

// Setting Oracle Parameter
// Bind the parameter as OracleDBType.Varchar2 
OracleParameter param = cmd.Parameters.Add("whereTxt", OracleDbType.Varchar2);
param.Direction = ParameterDirection.Input;

param.Value = "MY VALUE";

// Get returned values from select statement
OracleDataReader dr = cmd.ExecuteReader();

// Read the identifier for each  result and display it
while (dr.Read()) 
{
    Console.WriteLine(dr.GetValue(0));
}

Console.WriteLine("Selected successfully !");
Console.WriteLine("");

Console.WriteLine("***********************************************************");

Console.ReadKey();

如果我将下面的行更改为我想要的结果类型,那么我会得到一个错误"ORA-00933:SQL命令未正确结束":

String block = "SELECT * FROM TEMP_VIEW :1";
...
...
param.Value = "WHERE NAME = 'MY VALUE' AND ID = 5929";

我的问题是,如何在不导致此错误的情况下动态添加我的big where查询?

共有1个答案

寿飞飙
2023-03-14

可悲的是,实现这一点并不容易。

使用参数化SQL通常需要了解的一点是,绑定参数只能用于值,例如字符串、数字或日期。不能在其中放入SQL位,例如列名或WHERE子句。

一旦数据库有了SQL文本,它将尝试解析它并确定它是否有效,并且它将在不查看任何绑定参数值的情况下执行此操作。没有所有值,它将无法执行SQL。

SQL字符串SELECT*FROM TEMP_VIEW:1永远不会有效,因为Oracle不希望在TEMP_VIEW中的后面立即出现一个值。

您需要将SQL构建为字符串,同时还需要构建绑定参数列表。如果您发现需要在列NAME上添加条件,请将WHERE NAME=: 1添加到SQL字符串中,并添加一个名为: 1的参数和您希望添加的值。如果您要添加第二个条件,请将AND ID=: 2附加到SQL字符串中,并添加一个名为: 2参数

希望下面的代码能够更好地解释:

// Initialise SQL string and parameter list.
String sql = "SELECT * FROM DUAL";
var oracleParams = new List<OracleParameter>();

// Build up SQL string and list of parameters.
// (There's only one in this somewhat simplistic example.  If you have
// more than one parameter, it might be easier to start the query with
// "SELECT ... FROM some_table WHERE 1=1" and then append
// " AND some_column = :1" or similar.  Don't forget to add spaces!)
sql += " WHERE DUMMY = :1";
oracleParams.Add(new OracleParameter(":1", OracleDbType.Varchar2, "X", ParameterDirection.Input));

using (var connection = new OracleConnection() { ConnectionString = "..."})
{
    connection.Open();

    // Create the command, setting the SQL text and the parameters.
    var command = new OracleCommand(sql, connection);
    command.Parameters.AddRange(oracleParams.ToArray());

    using (OracleDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            // Do stuff with the data read...
        }
    }
}

 类似资料:
  • 我试图从MySQL移动到Oracle和我的一个查询最初看起来像这样 然而,当我在ORACLE中运行同一个查询时,只做了一个小改动。。。 它给了我以下错误: SQL错误:ORA-00933:SQL命令未正确结束00933。00000-“SQL命令未正确结束” Oracle SQL Developer工具强调了声明部分的一个问题 作为t1 我读了一些其他的问题,提到在Oracle语句的某些部分周围放置

  • 线程“main”java.SQL.sqlsyntaxerrorexception:ORA-00933:SQL命令未正确结束 我怀疑我们不能为Oracle查询提供“as employees_data”,那么我做错了什么?

  • 我遇到了一个甲骨文错误, ORA-00933:SQL命令未正确结束 有以下几点。 我在每个语句末尾的“/”前面加了分号。 有什么建议我可能错了吗?

  • 我试图使用骆驼路线中的MyBatis插入列表批处理将数据列表插入到表中。批处理失败,例外java.sql.批处理更新异常: ORA-00933:SQL命令未正确结束(下面有更多详细信息)。 我能够插入MyBatis API中没有问题的数据列表(参见本文第6节),但只有在骆驼路线上使用时,它才会失败 查询很好(请参阅本文中的5.SQL客户机查询),因为我能够成功地从SQL客户机插入数据。我尝试了几种

  • 目的是仅当同一个表中不存在相同的记录时,才将记录插入表中。所以,我将该表的值存储在如下游标中:- 现在,我将使用如下的内部联接从表中删除记录- 执行此删除语句时,我收到错误-'ORA-00933:SQL命令未正确结束' 如果我能够从表中删除记录,我将使用以下代码从游标数据中插入相同的记录到相同的表中:- 我的目标是,仅当同一个表中不存在相同的记录时,才将记录插入表中。 请指导如何处理delete语

  • 我试图在Laravel 4.2中使用Oracle作为后端执行更新命令,如下所示。每当我尝试这样做时,我都会出错 我该如何解决这个问题,我错在哪里?谢谢你的建议。