【问题标题】:Run .sql file containing PL/SQL in PowerShell在 PowerShell 中运行包含 PL/SQL 的 .sql 文件
【发布时间】:2021-02-08 23:57:03
【问题描述】:

我想找到一种使用 .NET Data Proider for Oracle (System.Data.OracleClient) 在 PowerShell 中运行包含 PL/SQL 的 .sql 文件的方法。 我肯定会避免使用 sqlplus 来完成这项任务。

这就是我现在的位置

add-type -AssemblyName System.Data.OracleClient

function Execute-OracleSQL
{
    Param
    (
        # UserName required to login
        [string]
        $UserName,

        # Password required to login 
        [string]
        $Password,

        # DataSource (This is the TNSNAME of the Oracle connection)
        [string]
        $DataSource,

        # SQL File to execute.
        [string]
        $File
    )

    Begin
    {
    }
    Process
    {   
        $FileLines = Get-Content $File
        $crlf = [System.Environment]::NewLine
        $Statement = [string]::Join($crlf,$FileLines)

        $connection_string = "User Id=$UserName;Password=$Password;Data Source=$DataSource"
        try{
            $con = New-Object System.Data.OracleClient.OracleConnection($connection_string)
            $con.Open()    
            $cmd = $con.CreateCommand()
            $cmd.CommandText = $Statement
            $cmd.ExecuteNonQuery();
        } catch {
            Write-Error (“Database Exception: {0}`n{1}” -f $con.ConnectionString, $_.Exception.ToString())
            stop-transcript
            exit 1
        } finally{
            if ($con.State -eq ‘Open’) { $con.close() }
        }
    }
    End
    {
    }
}

但我不断收到以下错误消息 "ORA-00933: SQL 命令未正确结束

文件的内容非常基本:

DROP TABLE <schema name>.<table name>;
create table <schema name>.<table name>
(
    seqtuninglog    NUMBER,
    sta             number,
    msg             varchar2(1000),
    usrupd          varchar2(20),
    datupd          date
);

【问题讨论】:

  • 错误提示问题出在文件中的 SQL 上,您没有显示。
  • 我猜是终结者的问题。以.sql 结尾的文件通常意味着在SQL*Plus 之类的环境中运行,该环境期望SQL 以; 结尾,而PL/SQL 以/ 结尾。但是,当您在大多数客户端中运行命令时,您必须删除这些终止符。但正如 Alex 所说,这将有助于添加有关文件内容的更多信息。
  • 我刚刚编辑了提到 .sql 文件内容的帖子。
  • 并且内容包含终止符;,@JonHeller 说应该删除。
  • 不幸的是,这没有帮助。错误信息是一样的。

标签: sql oracle powershell plsql system.data.oracleclient


【解决方案1】:

该文件包含 PL/SQL。它包含两条 SQL 语句,中间有一个分号语句分隔符(还有一个在末尾,你说你已经删除了)。

您使用该文件的内容调用ExecuteNonQuery,但它只能执行一条语句,而不是一次执行两条。

您有几个选择。在我的脑海中,没有特别的顺序:

a) 将语句拆分为单独的文件,让您的脚本以正确的顺序读取和处理它们;

b) 将它们保存在一个文件中,并让您的脚本根据分隔分号将其拆分为多个语句 - 如果您在某个时候实际上有 PL/SQL,这会有点混乱并且会变得讨厌,因为它有分号使用一个“语句”块,除非您将所有内容更改为使用/

c) 将语句包装在文件中的匿名 PL/SQL 中,但是当您使用 DDL(删除/创建)时,这些语句也必须更改为动态 SQL;

d) 让您的脚本将文件内容包装在一个匿名的 PL/SQL 块中,但是如果有 DDL 并动态地使其动态化,则必须解决这个问题;

e) 找到一个库来处理语句操作,这样您就不必计算所有边缘情况和组合(不知道是否存在这样的事情);

f) 使用您说过要避免的 SQL*Plus 或 SQLcl。

可能还有其他选择,但各有利弊。

【讨论】:

  • 感谢您的选择。事实上,我发送的示例相当简单,因为我不想添加很多代码行,但是是的,我有 .sql 文件,其中确实有 PL/SQL。我想避免创建 SQL 文件解析器,这会给我一个单独执行语句和块的选项。如果我分解您的建议,那么对于如此简单的任务来说,没有什么是开箱即用的。看来我被 SQL Plus 困住了...... :(
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 2014-09-15
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2016-11-08
相关资源
最近更新 更多