【问题标题】:Oracle procedure sample with datatable as input parametere以数据表为输入参​​数的 Oracle 过程示例
【发布时间】:2012-10-06 12:34:18
【问题描述】:

任何人都知道如何编写oracle存储过程数据表作为输入参数。

【问题讨论】:

    标签: c# asp.net database oracle stored-procedures


    【解决方案1】:

    将参数作为varchar2 传递,然后构建您的查询字符串并使用EXECUTE IMMEDIATE 或作为游标执行它。更多例子here

    更新。示例:

    create table temp11(id int not null);
    /
    create or replace
    procedure test_proc(table_name varchar2)
    as
      query_str varchar2(200);
      begin
      query_str := 'INSERT INTO '||table_name||'(id) values (2)';
      EXECUTE IMMEDIATE query_str ;
    
    end;
    /
    exec test_proc('temp11');
    commit;
    

    【讨论】:

    • 嗨 a1ex07 感谢您的回复,实际上我必须使用插入查询将整个表数据插入到数据库中,那么我该如何编写存储过程。任何示例请张贴。
    • @Sreedhar goud:检查示例。
    【解决方案2】:

    下面是从EMPLOYEES 复制一行到EMPLOYEES_COPY 的示例。 希望对你有帮助。

    DROP TABLE EMPLOYEES;
    /
    DROP TABLE EMPLOYEES_COPY; 
    /
    CREATE TABLE EMPLOYEES
    (
      ID INT,
      FIRST_NAME varchar(30),
      LAST_NAME varchar(30)
    );
    
    insert into EMPLOYEES values(1,'AA','BBB');
    insert into EMPLOYEES values(2,'CC','GGG');
    insert into EMPLOYEES values(3,'EEE','MMM');
    insert into EMPLOYEES values(4,'FFF','ZZZ');
    /
    CREATE TABLE EMPLOYEES_COPY 
    (
      ID INT,
      FIRST_NAME varchar(30),
      LAST_NAME varchar(30)
    );
    /
    CREATE OR REPLACE PACKAGE EMPLOYEE as 
    type t_cursor is ref cursor;
    procedure GETALL(curEMPLOYEE out t_cursor);
    procedure INSERT_COPY;
    end EMPLOYEE;
    /
    CREATE OR REPLACE PACKAGE BODY EMPLOYEE as
      ---------------------------------------------
     procedure GETALL(curEMPLOYEE out t_cursor) as
       begin
          open curEMPLOYEE  for SELECT id, FIRST_NAME, LAST_NAME
                               FROM   EMPLOYEES;    
       end GETALL;
     ---------------------------------------------
     procedure INSERT_COPY as
       cur t_cursor;
       emp employees%rowtype;
       begin
          GETALL(curEMPLOYEE=>cur);
            LOOP
        FETCH cur INTO emp;
           EXIT WHEN cur%NOTFOUND;
           insert into EMPLOYEES_COPY
           values(emp.id,emp.FIRST_NAME,emp.LAST_NAME);
       END LOOP;
       end INSERT_COPY;   
    end EMPLOYEE;
    /
    

    包非常有用,因为您可以对单个实体的功能进行分组。例如,我将针对员工的职能分组。

    您可以使用以下方法测试示例:

    BEGIN      
      EMPLOYEE.INSERT_COPY;  
      commit;      
    END;
    

    更多信息

    Here 是类似的问题。

    【讨论】:

    • 感谢 Parado 的回复,但我没有在数据库表之间做数据库表,而是将它从我的应用程序发送到要执行的程序。
    【解决方案3】:

    在这些情况下,使用数据库临时表是很常见的。这意味着您将数据表记录插入表中并在不关闭连接的情况下调用您的过程,以便它看到临时数据并对其进行处理。

    伪代码如下:

    //Get the data you want to process
    DataTable data = GetData();
    
    //Create new Connection
    Connection conn = Connection.CreateNew();
    
    //Open the connection
    conn.Open()
    
    //Insert the data on a temporary table using the open connection
    InsertDataIntoTemporaryTable(conn, data);
    
    //Call the procedure to process the data using the same open connection
    CallProcedureToProcessData(conn);
    
    //Finish by ending the connection (everything done in the procedure will be commited)
    conn.Close();
    

    另一个可实现的选项是使用 CLOB 参数构建过程,其中应用程序将传递与字段和行分隔符连接的所有数据表记录。该过程必须将其分成两种方式并形成更好的结构,例如由 varchar2 表形成的记录表。

    【讨论】:

    • 任何提及的示例示例
    • 当然,我可以添加一个我认为的示例。您还没有找到解决方案吗?
    • 是的,如果你有解决方案,我没有找到解决方案。
    • 我不明白你在做什么我了解获取数据表和打开连接但不是 InsertDataIntoTemporaryTable() 它是 c# 中的预定义方法。
    • 您是否完整阅读了我的回答?我提出的解决方案涉及一个数据库临时表,它是一个在连接仍然打开时保留记录的表。我发布的伪代码告诉你为了让它工作你必须执行的每一个步骤,它不是真正的代码,那些不是真正的类,这是我想象的代码可能变成的样子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多