【问题标题】:I want to covert rows from one table to columns to another table using Procedures(Pl/sql)我想使用 Procedure(Pl/sql) 将行从一个表转换为列到另一个表
【发布时间】:2013-07-23 09:41:22
【问题描述】:
table A:

col1
_______________________
jack 
1200
20
peter
2000
10
robert 
300
30

table B :

name   sal   deptno
-----------------------
jack 1200 20
peter 2000 10
robert 300 30

这里我想通过使用过程参数来实现。你能帮我尝试一下,但它给出了错误。

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;

这是我尝试过但显示很多错误的代码

【问题讨论】:

  • 向我们展示您的尝试
  • 并向我们展示如何关联行。我们怎么知道“jack”是name?我们如何知道 1200 与 jack 而不是 peter 相关联?记住堆组织表中的行本质上是无序的。
  • 给定的(如何将一个表中的一列数据作为 PL/SQL 中的不同列获取到另一表中)不是我的问题。更多关于该查询不回答我的问题。
  • 答案必须是程序,因为这就是教师想要的。你和this guy同班吗?

标签: sql oracle plsql procedures


【解决方案1】:

一种方法是:

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;

分享和享受。

【讨论】:

  • 我喜欢你的解决方案。但是我们怎么知道数据的顺序是正确的呢?它可以改变,不是吗?
【解决方案2】:

试试这个。假设每个consecutive three rows are name sal and deptno。可能是一些复杂的逻辑,但如果对您有帮助,请尝试一下。

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
  )

结果

【讨论】:

  • 我要程序查询!
  • 给点时间我正在研究这个:) 在那之前只是给了你一个提示:)
  • 好的,兄弟,这是我的想法,在这里创建过程 p1(varchar2 中的 v1),这里 v1 是我们传递给过程的参数,该参数我可以传递任何我想传递的东西,假设我传递了 'Nithesh,100,2000' 它带引号的参数单个参数,该参数必须拆分并放置在表上的不同列中
  • 3 列是固定的吗?并且 3 行在 col1 中顺序排列?我的意思是我们可以将前 3 个分组,这样第一个是名称,第二个是 sal,第三个是 depno。在所有 3 组中
  • 正如@JustinCave 在他对该问题的评论中指出的那样,该表是无序的,因此您不能指望以任何特定顺序将行取回。除非给出 ORDER BY,否则数据库可以按照它关心的任何顺序返回行。由于该表没有用于对数据进行排序的键,因此针对它编写的任何查询都依赖于在另一行之前或之后返回的一行,这本质上是不稳定的,今天“有效”的东西明天很可能不会有效。分享和享受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多