1

我想找到一种使用 .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
);
4

1 回答 1

2

该文件不包含PL/SQL。它包含两个 SQL 语句,中间有一个分号语句分隔符(最后是另一个,你说你已经删除了)。

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

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

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

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

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

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

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

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

可能还有其他选择,但它们都有优点和缺点。

于 2021-02-08T15:57:03.820 回答