SQL - 使用不同的名称循环
我是SQL新手。我想通过我的代码循环遍历表中的每个不同名称,并且我想在程序的其余部分使用该名称,所以我希望在变量中使用该名称。任何人都可以提供关于如何完成此任务的提示?我的想法是将表中的所有名称存储到一个数组中(但我一直无法找到如何创建数组)或列表并通过这些名称进行循环。任何帮助表示赞赏。SQL - 使用不同的名称循环
我继续断别人的代码的工作,这可能是PL/SQL,但继承人一些代码只是为了给在那里我去
CURSOR def_stud_pglts is
select portal_objname_pgt, portal_row_num, portal_col_num, portal_objname
from psprsmhpasgpglt
where portal_name='EMPLOYEE' and portal_objname = 'NRPA_ACADEMICS'
and portal_layoutbehav in ('2REQ', '3DEF');
cursor name_cur is
select distinct oprid from PSPRUHTABPGLT
where portal_objname = 'NRPA_ACADEMICS';
namerow name_cur%ROWTYPE;
pageletRow def_stud_pglts%ROWTYPE;
v_oprid VARCHAR2(30);
tmp tmpcur;
v_students NUMBER;
v_min NUMBER;
BEGIN
select count(distinct oprid)
into v_students
from (select distinct oprid from PSPRUHTABPGLT
where portal_objname = 'NRPA_ACADEMICS');
FOR pageletRow IN def_stud_pglts LOOP
OPEN tmp FOR select count(oprid) from pspruhtabpglt
where portal_objname_pgt = pageletRow.portal_objname_pgt
and portal_objname = 'NRPA_ACADEMICS'
and portal_minimize=1;
FETCH tmp INTO v_min;
CLOSE tmp;
INSERT INTO prtlpgltreport
VALUES (pageletRow.portal_objname_pgt,
'DEFAULT',NULL,v_min, v_clo, v_mov, pageletRow.portal_objname);
END LOOP;
的想法所以这是所有工作的代码。我想循环这一点,而改变它的地方说'NRPA_ACADEMICS'到我的表中的其他名称
AFAIK,你问的是不可能使用普通的SQL。它可以使用某些数据库提供的SQL的过程变体来完成。例如,Oracle有PL SQL。 (查看其他数据库的similar languages)。
如果你想使用一种编程语言来做到这一点,那么这是如何完成取决于语言。它归结为:
- 编写一个SQL查询,将提取您的结果,并执行它
- 叠代以任何方式请你的结果,把一些结果变量
- 做你想做什么你的变量
我假设你只是在数据库中工作 - 而不是在应用程序中工作。您可以使用游标或循环在数据库中实现您的要求;数据库基本上遍历选择,你可以编写一个控制块,它将在每次迭代中执行。
我不知道甲骨文语法,但这个链接描述的基本知识:http://www.techonthenet.com/oracle/cursors/declare.php
你去做到这一点,考虑到大多数人避免游标和循环尽可能之前,有些ferevently完全拒绝使用它们,以及除非需要,否则它们是不好的做法如果您可以使用基于集合的操作(即所有记录一次,而不是循环)来实现您的结果,那么这是首选路径。
正如他们所说,绝大多数任务都可以在不使用游标的情况下完成。您可以应用函数和临时表;还有各种其他工具可用。你究竟需要为每个“变量”做些什么?
不太清楚“程序的其余部分”是什么意思,但我会假设你的意思是一个存储过程。就我个人而言,我不建议使用游标,但由于我不知道问题的范围,所以我会尽可能直接回答。
下面是如何通过SQL表结果循环:
DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
SET @path = 'C:\Backup\'
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
BACKUP DATABASE @name TO DISK = @fileName
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
谢谢你的回复每个人,它帮助我了解SQL得多。我能够通过对代码进行以下修改来解决问题。
FOR pageletRow IN def_stud_pglts LOOP
v_tab := pageletRow.portal_objname;
select count(distinct oprid)
into v_students
from (select distinct oprid from PSPRUHTABPGLT
where portal_objname = v_tab);
OPEN tmp FOR select count(oprid) from pspruhtabpglt
where portal_objname_pgt = pageletRow.portal_objname_pgt
and portal_objname = v_tab
and portal_minimize=1;
FETCH tmp INTO v_min;
CLOSE tmp;
所以移动在循环内“oprids”的计数和放线v_tab:= pageletRow.portal_objname;存储循环的当前名称。希望用什么语言你想做到这一点的,这可能帮助其他人解决这个问题
你应该upvote有用的答案,并接受最好的答案。 – 2011-01-07 05:36:32
护理,以填补我们吗? (PHP,C#,VB,...)还有,我是什么类型的SQL Server(MSSQL,MySQL和...) – 2011-01-05 22:56:02
人在这个真正的新哈哈。 据我所知,即时通讯只是运行SQL查询。 和服务器.......希望我回答这个正确 它的Oracle服务器.....我真的不知道我能说什么。 – 2011-01-05 22:59:55