使用Powershell在Oracle中执行PL \ SQL脚本

时间:2016-05-25 06:24:46

标签: oracle powershell plsql

我编写了以下脚本,帮助我从一个文件中使用powershell执行PL \ SQL插入/更新命令。 如果我在同一个文件中添加任何select命令它将无法正常工作。 脚本如下,

cls
# Oracle Read File 

# Load the good assembly
Add-Type -Path "C:\app\ssz\product\12.1.0\client_1\odp.net\managed\common\Oracle.ManagedDataAccess.dll"

# Production connexion string
$compConStr = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=Host1)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=serv1)));User Id=test1;Password=test123;"

# Connection Object
$oraConn= New-Object Oracle.ManagedDataAccess.Client.OracleConnection($compConStr)
$oraConn.Open()

# Requête SQL
$MyQuery = get-content "C:\PANEL_UPDATE.sql";


Write-Output $MyQuery

# Command Object
$command1 = New-Object Oracle.ManagedDataAccess.Client.OracleCommand($MyQuery, $oraConn)
#$command1 = New-Object Oracle.ManagedDataAccess.Client.OracleCommand
#$command1.CommandText = $MyQuery
#$command1.Connection = $oraConn

# Execution
$reader1=$command1.ExecuteNonQuery()
#$reader1=$command1.ExecuteReader()

#while ($reader1.read())
#{
#  $DTable = $reader1["FILD_NAME"]  
#}

# Fermeture de la conexion
#$reader1.Close()
$oraConn.Close()

文件PANEL_UPDATE.sql的内容是,

BEGIN
  UPDATE TABLE1 SET COL1 = 'TEST1' WHERE COL1 = 'TEST2';
  UPDATE TABLE1 SET COL2 = 'TEST1' WHERE COL2 = 'TEST2';
  UPDATE TABLE1 SET COL3 = 'TEST1' WHERE COL2 = 'TEST2';
  SELECT COL1 FROM TABLE1 WHERE COL1 = 'TEST1';
END

以下是Powershell抛出的异常

Exception calling "ExecuteNonQuery" with "0" argument(s): "ORA-06550: line 1, column 319:
PLS-00428: an INTO clause is expected in this SELECT statement"
At C:\Users\ssz\Desktop\OracleReadFile.ps1:27 char:5
+     $reader1=$command1.ExecuteNonQuery()
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : OracleException

如果我从该文件中删除SELECT查询,它对我来说非常适合。 请帮我改一下powershell脚本,它将执行文件中的所有SQL命令..

谢谢, SAURABH

2 个答案:

答案 0 :(得分:1)

如果是多行输出,请尝试使用ref cursor,如果是标量输出,则可以使用INTO。希望这会有所帮助。

-- 1st approach using refcusor

DECLARE
p_lst sys_refcursor;
BEGIN
  UPDATE TABLE1 SET COL1 = 'TEST1' WHERE COL1 = 'TEST2';
  UPDATE TABLE1 SET COL2 = 'TEST1' WHERE COL2 = 'TEST2';
  UPDATE TABLE1 SET COL3 = 'TEST1' WHERE COL2 = 'TEST2';
Open P_LST FOR
  SELECT COL1 FROM TABLE1 WHERE COL1 = 'TEST1';
END;
/

-- 2st approach using INTO clause

DECLARE
p_lst varchar2(100);
BEGIN
  UPDATE TABLE1 SET COL1 = 'TEST1' WHERE COL1 = 'TEST2';
  UPDATE TABLE1 SET COL2 = 'TEST1' WHERE COL2 = 'TEST2';
  UPDATE TABLE1 SET COL3 = 'TEST1' WHERE COL2 = 'TEST2';
  SELECT COL1 INTO p_lst FROM TABLE1 WHERE COL1 = 'TEST1';
END;
/

答案 1 :(得分:1)

如果它是多行输出,请尝试使用ref游标;如果它是标量输出,则可以使用INTO。希望这会有所帮助。

-- 1st approach using refcusor

DECLARE
p_lst sys_refcursor;
BEGIN
  UPDATE TABLE1 SET COL1 = 'TEST1' WHERE COL1 = 'TEST2';
  UPDATE TABLE1 SET COL2 = 'TEST1' WHERE COL2 = 'TEST2';
  UPDATE TABLE1 SET COL3 = 'TEST1' WHERE COL3 = 'TEST2';
Open P_LST FOR
  SELECT COL1 FROM TABLE1 WHERE COL1 = 'TEST1';
END;
/

-- 2nd approach using INTO clause

DECLARE
p_lst varchar2(100);
BEGIN
  UPDATE TABLE1 SET COL1 = 'TEST1' WHERE COL1 = 'TEST2';
  UPDATE TABLE1 SET COL2 = 'TEST1' WHERE COL2 = 'TEST2';
  UPDATE TABLE1 SET COL3 = 'TEST1' WHERE COL3 = 'TEST2';
  SELECT COL1 INTO p_lst FROM TABLE1 WHERE COL1 = 'TEST1';
END;
/