我试图通过在.Net中使用OracleClientProvider来执行PL / Sql块。我使用的语言是c#,DB是oracle10g
我实际做的是以下内容:
//ConnectionSting is the connection String
OracleConnection connection = new OracleConnection(connectionString);
OracleCommand cmd = new OracleCommand();
cmd.Connection = connection;
//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;
// Open the connection
connection.Open();
cmd.ExecuteNonQuery();
//close the connection
connection.close();
当我通过ORACLE客户端运行PL / SQL块时,PL / SQL块正确执行但在这里它会抛出错误ORA-00922:缺少或无效选项
我想问一下:1。脚本是否以与普通查询不同的方式执行? 2.我做错了什么?
建议/答案
剧本:
Set serveroutput on
Declare
tableSize varchar2(200);
insertStatement varchar2(200) := 'Insert Into TableAndSize values (:1,:2,:3,:4) ';
rowupdateStatement varchar2(200) := 'select count(*) from :0';
numOfRows number := 0;
dataType nvarchar2(200);
queryConstruct varchar2(10000);
tableNameInUserTabColumns nvarchar2(4000);
num NUMBER :=0;
zero number := 0 ;
nums nvarchar2(4000);
fields nvarchar2(1000);
fieldSet nvarchar2(1000);
columnName nvarchar2(1000);
dummy nvarchar2(1000);
Cursor Table_Names is select Distinct TABLE_NAME from user_tab_columns where TABLE_NAME not like 'BIN%' and table_name != 'TABLEANDSIZE' order by table_name;
begin
execute immediate 'truncate table tableandsize';
open Table_Names;
fetch Table_Names into tableNameInUserTabColumns;
while Table_Names%found
loop
DBMS_OUTPUT.PUT_LINE(tableNameInUserTabColumns);
queryConstruct := 'select nvl( sum (';
--DBMS_OUTPUT.PUT('select sum (');
Declare
detailsOftableInScope user_tab_columns%rowtype;
cursor tableDetails is select * from user_tab_columns where table_name = tableNameInUserTabColumns;
Begin
open tableDetails;
fetch tableDetails into detailsOftableInScope;
while tableDetails%found
loop
dataType := detailsOftableInScope.DATA_TYPE;
if dataType = 'CLOB' then
fields := 'nvl(DBMS_LOB.GETLENGTH(' || detailsOftableInScope.COLUMN_NAME ||'),0)';
elsif dataType = 'BLOB' then
fields := 'nvl(DBMS_LOB.GETLENGTH('|| detailsOftableInScope.COLUMN_NAME ||'),0)';
elsif dataType = 'LONG' then
fields := 'nvl(VSIZE(''''),0)';
else
fields := 'nvl(vsize(' || detailsOftableInScope.COLUMN_NAME || '),0)';
end if;
--DBMS_OUTPUT.PUT('*****'||fields);
fetch tableDetails into detailsOftableInScope;
if tableDetails%found then
--DBMS_OUTPUT.PUT(''||fields||'+');
queryConstruct := queryConstruct || fields||'+';
else
--DBMS_OUTPUT.PUT(''|| fields);
queryConstruct := queryConstruct || fields;
DBMS_OUTPUT.ENABLE(100000);
end if;
end loop;
close tableDetails;
end;
--DBMS_OUTPUT.PUT_LINE(') as sizeOfTable from ' ||tableNameInUserTabColumns);
queryConstruct := queryConstruct || '),0) as sizeOfTable from ' ||tableNameInUserTabColumns;
DBMS_OUTPUT.PUT_LINE('Query Being Fired To calculate the size of Data in Table '||tableNameInUserTabColumns || ' ---> '||queryConstruct);
execute immediate queryConstruct into num;
execute immediate insertStatement using tableNameInUserTabColumns,num,zero,zero;
--DBMS_OUTPUT.PUT_LINE(num);
fetch Table_Names into tableNameInUserTabColumns;
end loop;
close Table_Names;
----finding number of rows and size of index
declare
sumTotal number := 0;
tableNameInUserTabColumns nvarchar2(4000);
updateStatement varchar2(400);
cursor Table_Names is select distinct(table_name) from user_tab_columns where TABLE_NAME not like 'BIN%' and table_name != 'TABLEANDSIZE' order by table_name;
begin
open Table_Names;
dbms_output.put_line('*********************finding index size and number of rows******************************');
fetch Table_Names into tableNameInUserTabColumns;
while Table_Names%found
loop
dbms_output.put_line('TABLE --- '||tableNameInUserTabColumns);
declare
Index_Name nvarchar2(4000);
size1 number := 0 ;
size2 number := 0 ;
tableIndexSize number := 0;
sizeOfIndexInTable number :=0 ;
sql_statement varchar2(1000) := 'select nvl(USED_SPACE,0) from index_stats';
stat1 varchar2(1000) := 'analyze index ';
stat2 varchar2(1000) := ' validate structure';
stat3 varchar2(2000) := '';
sum1 number := 0;
sum2 number := 0 ;
cursor indexOnTable is select Index_name from user_indexes where table_name = tableNameInUserTabColumns and index_type = 'NORMAL';
begin
open indexOnTable;
fetch indexOnTable into Index_Name;
while indexOnTable%found
loop
dbms_output.put_line('**** '||Index_Name);
DBMS_OUTPUT.ENABLE(100000);
stat3 := stat1 || Index_Name || stat2;
execute immediate stat3;
execute immediate sql_statement into size1;
dbms_output.put_line('Query being fired to find size of index = '|| Index_Name || 'in table = ' || tableNameInUserTabColumns || '===>>' || stat3 ||' And ' ||sql_statement);
tableIndexSize := tableIndexSize + size1;
--dbms_output.put_line(size1);
sumtotal:= sumtotal + size1 ;
--dbms_output.put_line(sumtotal);
fetch indexOnTable into Index_Name;
end loop;
rowupdateStatement := 'select count(*) from '|| tableNameInUserTabColumns;
dbms_output.put_line('Query to find number of rows in '|| tableNameInUserTabColumns || ' --> '||rowupdateStatement);
execute immediate rowupdateStatement into numOfRows;
--dbms_output.put_line('----'||numofrows ||'-----');
updateStatement := 'update tableAndsize set indexsize = :0, RowNumber = :1 where tablename = :2';
-- dbms_output.put_line('----'||tableIndexSize ||'*****'||tableNameInUserTabColumns);
execute immediate updateStatement using tableIndexSize,numOfRows,tableNameInUserTabColumns ;
--dbms_output.put_line(tableIndexSize);
--dbms_output.put_line(updateStatement);
close indexOnTable;
end;
fetch Table_Names into tableNameInUserTabColumns;
end loop;
close Table_Names;
end;
end;
感谢。
答案 0 :(得分:1)
只是一个猜测,但我注意到连接被打开两次,尝试删除其中一行。如果这不起作用,您可以发布您想要运行的查询样本吗?
文件是否可以使用编码为Unicode(UTF-16或UTF-8),并且流试图将其作为ASCII读取?
您是否查看了字符串的内容以确保没有“有趣”的字符?
答案 1 :(得分:0)
问题出在SQL脚本的最顶端:“设置服务器输出为开”
必须删除所有PL / SQL特定的指令,才能通过C#运行脚本。