Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想使用过程(Pl/sql)将行从一个表转换为列,再转换为另一个表_Sql_Oracle_Plsql_Procedures - Fatal编程技术网

我想使用过程(Pl/sql)将行从一个表转换为列,再转换为另一个表

我想使用过程(Pl/sql)将行从一个表转换为列,再转换为另一个表,sql,oracle,plsql,procedures,Sql,Oracle,Plsql,Procedures,到 这里我想通过使用过程参数来实现这一点。你能帮我一下吗?我试过了,但有错误 table B : name sal deptno ----------------------- jack 1200 20 peter 2000 10 robert 300 30 创建过程GetDatafromtable_A(varchar2中的V_1) 作为 游标rwdatacursor是从表a中选择原始数据,其中rowid尝试此操作。假设每个连续的三行是name sal和deptno。可能是一些复杂的

这里我想通过使用过程参数来实现这一点。你能帮我一下吗?我试过了,但有错误

table B :

name   sal   deptno
-----------------------
jack 1200 20
peter 2000 10
robert 300 30
创建过程GetDatafromtable_A(varchar2中的V_1)
作为

游标rwdatacursor是从表a中选择原始数据,其中rowid尝试此操作。假设每个
连续的三行是name sal和deptno
。可能是一些复杂的逻辑,但如果它对你有帮助的话,试试看

create procedure GetDatafromtable_A(V_1 in varchar2)
as
CURSOR rwdatacursor IS select Raw_Data  from table_a where rowid<=3)
T_record rwdatacursor%rowtype;
begin
open rwdatacursor;
loop
fetech rwdatacursor into T_record;
exit when rwdatacursor%NOTFUND;
insert into temp_process;
end loop
close rwdatacursor;
end;
结果

一种方法是:

CREATE TABLE #temp(slNo INT IDENTITY(1,1),col1 VARCHAR(50))
INSERT INTO #temp 
SELECT col1 FROM table_A

INSERT INTO table_B(name  , sal ,  deptno)
SELECT name,sal,depno
FROM 
  (  SELECT col1 AS name, ROW_NUMBER() OVER (ORDER BY col1) AS RowNum 
     FROM #temp WHERE slNo % 3 =1) AS T1
  FULL OUTER JOIN
    (SELECT col1 AS sal, ROW_NUMBER() OVER (ORDER BY col1) AS RowNum 
     FROM #temp WHERE slNo%3=2) AS T2
  ON T2.RowNum = T1.RowNum
  FULL OUTER JOIN 
      (SELECT col1 AS depno, ROW_NUMBER() OVER (ORDER BY col1) AS RowNum 
       FROM #temp WHERE slNo%3=0) AS T3
  ON T3.RowNum = T2.RowNum
  )

分享和享受。

向我们展示您尝试过的内容,并向我们展示如何关联行。我们如何知道“jack”是一个
名称
?我们如何知道1200与
杰克
有关,而不是与
彼得
有关?请记住,堆组织表中的行本质上是无序的。给定行的可能重复(如何将一列数据作为PL/SQL中的不同列从一个表中获取到另一个表中)不是我的问题。更多的问题不能回答我的问题。答案必须是一个过程,因为这是讲师想要的。你和我在同一个班吗?我想要一个过程查询!给点时间我正在做:)在那之前我给了你一个提示:)好的,兄弟,这是我的想法,创建过程1(v1在varchar2中)这里v1是一个参数,我们把它传递到过程中,这个参数我可以传递任何我想传递的东西,假设我传递'Nithesh,1002000'这是一个参数单参数,带引号,参数必须拆分并放置在表3的不同列中。列是固定的,对吗?第1列中有3行是按顺序排列的?我的意思是我们可以把前三个分组,第一个是名字,第二个是萨尔,第三个是德普诺。JustinCave在他对这个问题的评论中指出,在所有3人组中,这个表是无序的,因此你不能指望以任何特定的顺序将行取回。除非给出order BY,否则数据库可以按其关心的任何顺序返回行。由于该表没有用于对数据进行排序的键,因此针对该表编写的任何查询(一行在另一行之前或之后返回)本质上是不稳定的,而今天“有效”的内容明天可能很难奏效。分享和享受。我喜欢你的解决方案。但我们如何知道数据的顺序正确呢?它可能会改变,不是吗?
CREATE TABLE #temp(slNo INT IDENTITY(1,1),col1 VARCHAR(50))
INSERT INTO #temp 
SELECT col1 FROM table_A

INSERT INTO table_B(name  , sal ,  deptno)
SELECT name,sal,depno
FROM 
  (  SELECT col1 AS name, ROW_NUMBER() OVER (ORDER BY col1) AS RowNum 
     FROM #temp WHERE slNo % 3 =1) AS T1
  FULL OUTER JOIN
    (SELECT col1 AS sal, ROW_NUMBER() OVER (ORDER BY col1) AS RowNum 
     FROM #temp WHERE slNo%3=2) AS T2
  ON T2.RowNum = T1.RowNum
  FULL OUTER JOIN 
      (SELECT col1 AS depno, ROW_NUMBER() OVER (ORDER BY col1) AS RowNum 
       FROM #temp WHERE slNo%3=0) AS T3
  ON T3.RowNum = T2.RowNum
  )
PROCEDURE CONVERT_TABLES IS
  CURSOR DATA_CURSOR IS
    SELECT COL1
      FROM TABLE_A;

  row1 DATA_CURSOR%ROWTYPE;
  row2 DATA_CURSOR%ROWTYPE;
  row3 DATA_CURSOR%ROWTYPE;
BEGIN
  OPEN DATA_CURSOR;

  LOOP
    FETCH DATA_CURSOR INTO row1;
    EXIT WHEN DATA_CURSOR%NOTFOUND;

    FETCH DATA_CURSOR INTO row2;
    EXIT WHEN DATA_CURSOR%NOTFOUND;

    FETCH DATA_CURSOR INTO row3;
    EXIT WHEN DATA_CURSOR%NOTFOUND;

    INSERT INTO TABLE_B (NAME, SAL, DEPTNO)
      VALUES (row1.COL1, row2.COL1, row3.COL1);
  END LOOP;

  CLOSE DATA_CURSOR;
END CONVERT_TABLES;