带有数据表作为输入参数的Oracle过程示例

时间:2012-10-06 12:34:19

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

任何机构都知道如何将oracle存储过程数据表写为输入参数。

3 个答案:

答案 0 :(得分:0)

将参数传递为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;

答案 1 :(得分:0)

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

伪代码是这样的:

//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表组成的记录表。

答案 2 :(得分:0)

以下是将一行从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也是类似的问题。