我是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”更改为表格中的其他名称时将其循环播放
答案 0 :(得分:0)
AFAIK,使用纯SQL无法提出要求。可以使用某些数据库提供的SQL的过程变体来完成。例如,Oracle有PL SQL。 (查看其他数据库的similar languages)。
如果您想使用编程语言来完成此操作,那么如何完成此操作取决于语言。归结为:
答案 1 :(得分:0)
我假设您只在数据库中工作 - 而不是在应用程序中。您可以使用游标或循环在数据库中实现您的需求;数据库基本上遍历选择,你可以编写一个控制块,它将在每次迭代时执行。
我不了解Oracle语法,但此链接介绍了基础知识:http://www.techonthenet.com/oracle/cursors/declare.php
在你去之前,考虑到大多数人尽可能避免使用游标和循环,有些人总是拒绝使用它们,除非有必要,否则它们是不好的做法。如果您可以使用基于集合的操作(即所有记录一次,而不是循环)来实现结果,那么这是首选路径。
正如他们所说,绝大多数任务都可以在不使用游标的情况下完成。您可以应用函数和临时表;还有其他各种工具可供选择。你究竟需要为每个“变量”做些什么?
答案 2 :(得分:0)
不太确定“程序的其余部分”是什么意思,但我认为你的意思是存储过程。就个人而言,我不建议使用游标,但由于我不知道问题的范围,我会尽可能直接回答它。
以下是循环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
答案 3 :(得分:0)