我想使用过程(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;