2011-01-05 81 views
0

我是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'到我的表中的其他名称

+4

护理,以填补我们吗? (PHP,C#,VB,...)还有,我是什么类型的SQL Server(MSSQL,MySQL和...) – 2011-01-05 22:56:02

+0

人在这个真正的新哈哈。 据我所知,即时通讯只是运行SQL查询。 和服务器.......希望我回答这个正确 它的Oracle服务器.....我真的不知道我能说什么。 – 2011-01-05 22:59:55

回答

0

AFAIK,你问的是不可能使用普通的SQL。它可以使用某些数据库提供的SQL的过程变体来完成。例如,Oracle有PL SQL。 (查看其他数据库的similar languages)。

如果你想使用一种编程语言来做到这一点,那么这是如何完成取决于语言。它归结为:

  1. 编写一个SQL查询,将提取您的结果,并执行它
  2. 叠代以任何方式请你的结果,把一些结果变量
  3. 做你想做什么你的变量
0

我假设你只是在数据库中工作 - 而不是在应用程序中工作。您可以使用游标或循环在数据库中实现您的要求;数据库基本上遍历选择,你可以编写一个控制块,它将在每次迭代中执行。

我不知道甲骨文语法,但这个链接描述的基本知识:http://www.techonthenet.com/oracle/cursors/declare.php

你去做到这一点,考虑到大多数人避免游标和循环尽可能之前,有些ferevently完全拒绝使用它们,以及除非需要,否则它们是不好的做法如果您可以使用基于集合的操作(即所有记录一次,而不是循环)来实现您的结果,那么这是首选路径。

正如他们所说,绝大多数任务都可以在不使用游标的情况下完成。您可以应用函数和临时表;还有各种其他工具可用。你究竟需要为每个“变量”做些什么?

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 
0

谢谢你的回复每个人,它帮助我了解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;存储循环的当前名称。希望用什么语言你想做到这一点的,这可能帮助其他人解决这个问题

+1

你应该upvote有用的答案,并接受最好的答案。 – 2011-01-07 05:36:32