Oracleデータベースの実装はデータを表形式で返します

既知のテーブルの関係:以下に示すとおり

期待:以下のように、すべての生徒の試験記録を表形式で返します:水平ヘッダーとして件名、垂直ヘッダーとして名前

2つの主要なステップがあります

ステップ1:サブジェクトを列として新しいテーブル(test_infoを作成します。操作は次のとおりです。

詳細なケースについては、https://blog.csdn.net/super_DuoLa/article/details/103199300を参照してください。

1. PL / SQLを開き、「プロシージャ」を見つけ、「新規...」を右クリックします。次のコンテンツが表示され、フォーマットに従って必要なコンテンツを入力します

2. [OK]をクリックして保存プロセスに入り、コードの記述を開始します

create or replace procedure testTable(graId VARCHAR2) is
      str1 varchar2(4000); --获取建表所需数据的SQL语句
      str2 varchar2(200); --用于存放  原数据中的单个元素
      ds sys_refcursor; --游标,指针用于循环 
      createsql varchar2(4000); --创建新表
      a number; --表存在的个数
      dl varchar2(4000); --删除表
      dorpsql varchar2(4000); --验证表是否存在
  begin
        DBMS_OUTPUT.ENABLE(buffer_size => null); 
   str1:='SELECT DISTINCT subname from msubject where graid='''||graId||'''';  --所需数据
   dl:='drop table test_info';  --删除表
   createsql:='create table test_info(姓名  varchar2(4000),合计 varchar2(4000)';
     open ds for str1; --将获取到的原数据进行循环,ds作为过渡元素使用
           LOOP  
              FETCH ds INTO str2; --将ds中的结果依次插入到str2中
              EXIT WHEN ds%NOTFOUND;  --没有数据的时候,循环结束
                 createsql:=createsql||','||str2||' varchar2(4000)'; --拼接字符串【原数据中的元素】             
          END LOOP;         
      CLOSE ds;
        createsql:=createsql||')'; 
        dorpsql:='select count(*) from user_tables  where TABLE_NAME =upper(''test_info'')'; --查表
         execute immediate dorpsql into a;  --将查询是否存在的结果赋值给计数变量a
         if a = 1 then  --表存在
          execute immediate dl;   --执行删除语句
         end if;
         dbms_output.put_line(createsql); --打印语句
         execute immediate createsql;  --执行创建新表的语句

end testTable;

図3に示すように、準備ストアドプロシージャの完了後に実行される下記クリックアップ黄色のリングギア

4.ストアドプロシージャを呼び出します(呼び出し形式はmybatisでは異なります。詳細はを参照してください)。

--语法  call  方法名称(参数)
call testTable('11111')

5.正常に実行した後、結果を表示します

この時点で、クエリ結果を新しい列名として使用して、テーブル構造を動的に作成しました。

ステップ2:ストアドプロシージャを記述して結果を取得する

1.「パッケージを見つけ、「新規...」を右クリックします。次のコンテンツが表示され、フォーマットに従って必要なコンテンツを入力します

2.次の図に示すように、基本的なストアドプロシージャとは異なり、ストアドプロシージャは[パッケージ]の下に作成されます。ストアドプロシージャは、[パッケージ]と[パッケージ本体]の2つの部分分かれています。示されている

3.基本構造を理解したら、プログラミングを開始します。2つの部分に分かれています

create or replace package testRecords is

  -- Author  : ADMIN
  -- Created : 2019/11/27 14:07:47
  -- Purpose : 学生的考试记录
  
  TYPE testdata IS TABLE of test_info%rowtype; --返回结果testdata是表test_info类型
   
  --实现的方法(参数是年级)
  function mResult(graId VARCHAR2)   return testdata PIPELINED;


end testRecords;
create or replace package body testRecords is

  --获取学生的考试记录
  function  mResult(graId VARCHAR2)  return testdata PIPELINED is
    str varchar2(4000);--存放“课程”查询语句
    transition varchar2(4000);--循环
    ds sys_refcursor;--游标
    rests test_info%rowtype;--结果行
    mstr LONG; --结果SQL语句
  begin
   DBMS_OUTPUT.ENABLE(buffer_size => null);
   str:='SELECT DISTINCT subname from msubject where graid='''||graId||'''';
   mstr:='select MAX (U . NAME) AS 姓名,COUNT (a. ID) AS 合计';
   open ds for str;   --将str中的值赋值给ds
       LOOP  
          FETCH ds INTO transition;  --循环ds,并依次将值赋给transition
          EXIT WHEN ds%NOTFOUND;  --没有数据的时候,循环结束
          mstr:=mstr||',COUNT(CASE WHEN subname ='''||transition||''' THEN 1 END) AS  "'||transition||'"';  --如果满足学生与学科对应,则+1
       END LOOP;     
    CLOSE ds;
       mstr:=mstr||' FROM MUSER U LEFT JOIN (SELECT * FROM MRECORDS) A ON u.id=a.usid LEFT JOIN MSUBJECT  b ON b.ID = a.subname  WHERE  b.graid='''||graId||''' GROUP BY U . ID';
       dbms_output.put_line(mstr);  --打印语句【相当于Java中的  System.out.print()】
       open ds for mstr;   --将查询到的结果集赋值给临时变量ds
       LOOP  
          FETCH ds INTO rests;   --将结果集循环插入到rests结果行中
          EXIT WHEN ds%NOTFOUND;
          PIPE ROW(rests);   --多个结果行最终会返回结果行集合,即生成表格 【PIPE:管道函数即是可以返回行集合】      
       END LOOP;     
    CLOSE ds;
   return;
  end;


end testRecords;

4. 最初のステップの操作と同じように、ストアード・プロシージャーを実行します

5.ストアドプロシージャを呼び出す(mybatisでは同じ呼び出し形式)

--语法  select * FROM table(名称.方法名(参数))
select * FROM table(testrecords.mResult('11111'))

6.結果の表示:正常に実行されると、次の結果がコンソールに表示されます

PS:上図の丸で囲まれたラベルをクリックすると、以下に示すように、保存プロセス中に印刷された結果が表示されます。

これまでのところ:「学生のテストレコードはデータとしてテーブルに返されます」。記事中の説明・コメントは個人の理解によるものですので、お気づきの点がございましたら是非訂正お願いします!

77件の元の記事を公開 100件のいい 70,000回以上の閲覧

おすすめ

転載: blog.csdn.net/super_DuoLa/article/details/103276584