在C#中执行PL / SQL脚本块时出现问题

时间:2011-02-16 13:27:06

标签: c# .net oracle10g

我试图通过在.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;

感谢。

2 个答案:

答案 0 :(得分:1)

只是一个猜测,但我注意到连接被打开两次,尝试删除其中一行。如果这不起作用,您可以发布您想要运行的查询样本吗?

文件是否可以使用编码为Unicode(UTF-16或UTF-8),并且流试图将其作为ASCII读取?

您是否查看了字符串的内容以确保没有“有趣”的字符?

答案 1 :(得分:0)

问题出在SQL脚本的最顶端:“设置服务器输出为开”

必须删除所有PL / SQL特定的指令,才能通过C#运行脚本。