是否可以使用 ODP.NET (Oracle.ManagedDataAccess) 执行 SQLPLUS 脚本?
Is it possible to execute a SQLPLUS script using ODP.NET (Oracle.ManagedDataAccess)?
我有一个连接到数据库的控制台应用程序(使用 Oracle.ManagedDataAccess
),然后尝试执行位于我本地硬盘驱动器上的一堆 SQL*PLUS
脚本。
不幸的是,尽管我的应用程序适用于简单的 SQL 语句 (SELECTS
),但它似乎不适用于 SQL*PLUS
.
代码:
var script = File.ReadAllText("C:\Automation\script.sql");
using (var objConn = new OracleConnection(_connectionString))
{
OracleCommand objCmd = new OracleCommand();
objCmd.Connection = objConn;
objCmd.CommandText = script;
objCmd.CommandType = CommandType.Text;
try
{
objConn.Open();
objCmd.ExecuteNonQuery();
}
catch(Exception ex)
{
Console.WriteLine("Exception: {0}", ex.ToString());
}
finally
{
objConn.Close();
}
}
Script.sql - 在 SQL Developer
中无错误执行
DEFINE CODE_PATH = C:\Automation
@"&&CODE_PATH\Test.sql"
Test.sql - 在没有 SQL*PLUS
的 SQL Developer\my 应用程序中无错误执行
SELECT ID FROM data.SOME_TABLE WHERE ROWNUM < 100
错误:
ORA-00900: invalid SQL statement at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
我错过了什么?这可能吗?
我仍然不确定是否可以通过ODP.NET执行slqplus,我怀疑是不可能的。
因此,作为解决方法,我将直接调用 sqlplus.exe。
代码:
static void execString(string userName, string password, string scriptFileName, string dataSource)
{
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = "sqlplus.exe";
processInfo.Arguments = String.Format("{0}/{1}@{2} @{3}", userName, password, dataSource, scriptFileName);
Process process = Process.Start(processInfo);
}
感谢Rich's post from 8 years ago for the workaround
答案是否定的
ODP.NET 和其他 Oracle 编程接口(OCI、OCCI、JDBC 等)旨在执行 SQL、PL/SQL 以及对存储过程和函数的调用。它们并非设计用于处理 SQL*Plus 语法(顺便说一句,除了“@”符号外,它还包含许多其他非 SQL、非 PL/SQL 命令 - 例如 "show errors").
SQL * Plus 脚本旨在由 SQL*Plus 单独执行,但近年来 SQL Developer,Oracle Developer Tools for Visual Studio,以及其他一些 Oracle 工具已经为它添加了解析器。但是,这些解析器不会通过 public API 公开。
我有一个连接到数据库的控制台应用程序(使用 Oracle.ManagedDataAccess
),然后尝试执行位于我本地硬盘驱动器上的一堆 SQL*PLUS
脚本。
不幸的是,尽管我的应用程序适用于简单的 SQL 语句 (SELECTS
),但它似乎不适用于 SQL*PLUS
.
代码:
var script = File.ReadAllText("C:\Automation\script.sql");
using (var objConn = new OracleConnection(_connectionString))
{
OracleCommand objCmd = new OracleCommand();
objCmd.Connection = objConn;
objCmd.CommandText = script;
objCmd.CommandType = CommandType.Text;
try
{
objConn.Open();
objCmd.ExecuteNonQuery();
}
catch(Exception ex)
{
Console.WriteLine("Exception: {0}", ex.ToString());
}
finally
{
objConn.Close();
}
}
Script.sql - 在 SQL Developer
中无错误执行 DEFINE CODE_PATH = C:\Automation
@"&&CODE_PATH\Test.sql"
Test.sql - 在没有 SQL*PLUS
SELECT ID FROM data.SOME_TABLE WHERE ROWNUM < 100
错误:
ORA-00900: invalid SQL statement at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
我错过了什么?这可能吗?
我仍然不确定是否可以通过ODP.NET执行slqplus,我怀疑是不可能的。
因此,作为解决方法,我将直接调用 sqlplus.exe。
代码:
static void execString(string userName, string password, string scriptFileName, string dataSource)
{
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = "sqlplus.exe";
processInfo.Arguments = String.Format("{0}/{1}@{2} @{3}", userName, password, dataSource, scriptFileName);
Process process = Process.Start(processInfo);
}
感谢Rich's post from 8 years ago for the workaround
答案是否定的
ODP.NET 和其他 Oracle 编程接口(OCI、OCCI、JDBC 等)旨在执行 SQL、PL/SQL 以及对存储过程和函数的调用。它们并非设计用于处理 SQL*Plus 语法(顺便说一句,除了“@”符号外,它还包含许多其他非 SQL、非 PL/SQL 命令 - 例如 "show errors").
SQL * Plus 脚本旨在由 SQL*Plus 单独执行,但近年来 SQL Developer,Oracle Developer Tools for Visual Studio,以及其他一些 Oracle 工具已经为它添加了解析器。但是,这些解析器不会通过 public API 公开。