SQL - 使用不同的名称循环

时间:2011-01-05 22:52:45

标签: 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 个答案:

答案 0 :(得分:0)

AFAIK,使用纯SQL无法提出要求。可以使用某些数据库提供的SQL的过程变体来完成。例如,Oracle有PL SQL。 (查看其他数据库的similar languages)。

如果您想使用编程语言来完成此操作,那么如何完成此操作取决于语言。归结为:

  1. 编写一个SQL查询,它将获取您的结果并执行它
  2. 以任何方式迭代结果,将一些结果放入变量
  3. 用变量做你想做的事

答案 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)