.net - 如何为 ADO.NET 拆分 Oracle sql 语句

标签 .net database oracle ado.net

拆分 SQL 语句以发送到 Oracle ADO.NET 客户端的正确方法是什么?例如,假设您在文本文件中有以下代码并想要执行这些语句:

CREATE TABLE foo (bar VARCHAR2(100));
INSERT INTO foo (bar) VALUES('one');
INSERT INTO foo (bar) VALUES('two');

我相信尝试在一个命令中发送所有这些会导致 Oracle 提示“;”。我的第一个想法是拆分“;”字符,一次发送一个。

但是,存储过程也可以包含分号,那么我该怎么做才能使拆分例程将整个存储过程保持在一起呢?它是否也需要查找开始/结束语句或“/”?

ODP.NET 和 Micrsoft Oracle Provider 在这些方面有什么区别吗?

最佳答案

如果没有 DDL,您可以通过用 BEGIN 和 END 包围语句来创建匿名 PL/SQL block :

BEGIN
  INSERT INTO foo (bar) VALUES('one');
  INSERT INTO foo (bar) VALUES('two');
END;

要执行 DDL(如 CREATE TABLE),您需要使用动态 PL/SQL:

BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE foo (bar VARCHAR2(100))';
  EXECUTE IMMEDIATE 'INSERT INTO foo (bar) VALUES(:v)' USING 'one';
  EXECUTE IMMEDIATE 'INSERT INTO foo (bar) VALUES(:v)' USING 'two';
END;

INSERTS 也是动态的,因为表在运行 block 之前不存在,因此无法编译。

注意:这是一个不寻常的要求:应用程序通常不应创建表!

关于.net - 如何为 ADO.NET 拆分 Oracle sql 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/308963/

相关文章:

database - H2数据库更新多列

oracle - 使用 xpath 在 XMLType 列中查找特定节点在 xml 中的出现,并且根节点和子节点标记具有不同的命名空间前缀

sql - count (*) 和 count(attribute_name) 有什么区别?

.net - WPF、Silverlight 或 XNA : Choosing a platform for game development

mysql - 无法使用 rails 连接到远程 mysql 数据库

c# - LINQ Distinct 未按预期工作

java - 广泛的更新声明

oracle - 使用 FUNCTION 而不是 CREATE FUNCTION oracle pl/sql

c# - 检查空值后出现空引用异常(检查空值不起作用)

c# - 在 .net 中更改 MDI 容器窗体的背景颜色或背景图像