2011-01-05 11 views
0

私はSQLを初めて使用しています。私はテーブルからそれぞれ別の名前で自分のコードをループしたいので、残りのプログラムでその名前を使用したいので、その名前を変数に入れたいと思います。誰でもこれを達成するためのヒントを与えることができますか?私の考えは、テーブルから配列のすべての名前を格納する(しかし、私は配列を作る方法を見つけることができませんでした)またはそれらの名前を介してリストとループ。どんな助けもありがとうございます。私はよそのコードのオフ作業を続けてい別名でのSQLルーピング

が、これは、PL/SQLかもしれないが、HERESにいくつかのコードは、ちょうどので、これはすべての作業のコードがあるイム

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サーバー(MsSQL、MySQL、...) –

+0

私はこのハハで本当に新しいです。 私が知っている限り、SQLクエリを実行しています。 とサーバー...うまくいけば私はこれに正しく答える そのOracleサーバー.....私は正直なところ私が言うことができるか分からない。 –

答えて

0

AFAIK、プレーンSQLを使用することはできません。いくつかのデータベースが提供するSQLの手続き型バリアントを使用して行うことができます。たとえば、OracleはPL SQLです。 (他のデータベースについてはsimilar languagesを見てください)。

これを行うにはプログラミング言語を使用する場合は、どのようにするかは言語によって異なります。それはこれに沸く:

  1. は、あなたの結果を取得し、変数
  2. にいくつかの結果を入れますしてくださいは、あなたがやりたい任意の方法で
  3. 結果以上の反復を、それを実行するSQLクエリを記述しますあなたの変数
0

私はあなたがアプリケーションではなくデータベースでのみ作業していると仮定します。カーソルまたはループを使用してデータベース内の要件を達成することができます。基本的にデータベースは選択範囲を反復し、各反復で実行されるコントロールブロックを作成することができます。

私はOracleの構文を知らないが、このリンクは基本について説明します。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を理解する助け、everyonesの返事をいただき、ありがとうございます。私はこのコードを次のように変更することで、この問題を解決することができました。

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し、最善の答えを受け入れる必要があります。 –