Estou tentando executar um bloco PL/Sql usando o OracleClientProvider em .Net. A linguagem que estou usando é c#, o DB é oracle10g
O que estou realmente fazendo é o seguinte:
//ConnectionSting is the connection String
OracleConnection connection = new OracleConnection(connectionString);
OracleCommand cmd = new OracleCommand();
cmd.Connection = connection;
// Open the connection
connection.Open();
//queryFile contains the PL/SQL Script I am trying to execute;
String queryFile = ConfigurationManager.AppSettings["MasterDbScript"];
String dataInFile = new StreamReader(queryFile).ReadToEnd();
cmd.CommandText = dataInFile;
connection.Open();
cmd.ExecuteNonQuery();
//close the connection
connection.close();
O bloco PL/SQL executa corretamente quando eu o executo pelo cliente ORACLE, mas aqui ele lança um erro ORA-00922: opção ausente ou inválida
Gostaria de perguntar: 1. Os scripts são executados de forma diferente da consulta normal? 2. O que estou fazendo de errado?
Sugestões/Respostas
Obrigado.
Pelo meu entendimento limitado, os blocos devem ser incorporados no C# ou colocados em um pacote e chamados. Eu já vi assim:
Como você não está mostrando seu script para nós, vamos trabalhar ao contrário. crie uma tabela no seu banco de dados
e coloque o seguinte em seu arquivo de script
Depois de executar seu código, você pode verificar se funcionou selecionando no banco de dados.
O próximo passo será usar algum begin end; bloco não retornando nenhum conjunto de resultados.
Geralmente o Ado não pode processar scripts inteiros. Usando o sql-server, ele pode processar lotes, que são partes de um script separado por instruções go. Tanto quanto eu sei, para o Oracle, ele só pode processar uma única instrução sql ou um bloco inicial e final.
Editar: Aqui está um pequeno PowerShell que você pode usar para tentar o que é possível:
Por exemplo, você vê que o seguinte falha (adicionei um ponto-e-vírgula):
E isso também falha:
Em uma primeira aproximação, você pode pensar em '/' como semelhante ao delimitador de lote sql-server go.