Apr24th

SQL

Top / SQL

ユーザ作成
・表領域とデータファイル作成

create tablespace micitXXX_DATA01 datafile '/u01/oracle/oradata/mictst/micitXXX_data01.dbf' size 100M autoextend on next 10M maxsize 3G,'/u01/oracle/oradata/mictst/micitXXX_data02.dbf' size 100M autoextend on next 10M maxsize 3G;

・INDEX表領域とデータファイル作成

create tablespace micitXXX_INDEX01 datafile '/u01/oracle/oradata/mictst/micitXXX_index01.dbf' size 100M autoextend on next 10M maxsize 3G;

・ユーザ作成と権限付与

create user micitXXX profile MICTEST identified by passwordXX default tablespace micitXXX_DATA01 temporary tablespace TEMP quota unlimited on micitXXX_DATA01 quota unlimited on micitXXX_INDEX01  account unlock;
grant connect to micitXXX;
grant resource to micitXXX;
grant create view to micitXXX;

スキーマの復元

--セッション確認--
select proc.spid, ses.sid, ses.serial#, ses.username, ses.program, ses.machine, ses.osuser from v$session ses, v$process proc where ses.paddr = proc.addr;
--セッションKILL--
alter system kill session '[sid], [serial#]';
--既存スキーマ削除--
drop user micit10 cascade;
--DB復元--
# impdp micsys/mi9sys dumpfile=usrexp_micit10_20161128_153801.dmp schemas=MICIT10 logfile=imp_micit10_20161129_2.log
--パスワード変更--
alter user micit02 identified by "password02";
--プロファイル変更(必要であれば)--
alter user MICIT06 profile MICTEST;

エクスポート

expdp micsys/mi9sys directory=DATA_PUMP_DIR dumpfile=exp_miciks1_20181026_before.dmp schemas=miciks1 logfile=exp_miciks1_20181026_before.log
・TBL除外
expdp micsys/mi9sys dumpfile=exp_micrc05_20180209_table.dmp logfile=exp_micrc05_20180209_table.log tables=micrc05.TBL_ALL_2ND_KYKN_TNP_CHG_R, micrc05.TBL_1802_KYKN_TNP_I,micrc05.TBL_1802_KYKN_TNP_CHG_HS_R

インポート

impdp micsys/mi9sys directory=DATA_PUMP_DIR dumpfile=exp_micit06_20190115.dmp remap_schema=micit06:micmt02 remap_tablespace=micit06_data01:micmt02_data01 remap_tablespace=micit06_index01:micmt02_index01 logfile=imp_micmt02_20190115.log
・データのみ
 impdp system/micadmin directory=dump_dir dumpfile=exp_micif01_20181220_table.dmp content=data_only remap_schema=micif01:micmt101 remap_tablespace=micif01_data01:micmt101_data01 remap_tablespace=micif01_index01:micmt101_index01 tables=micif01.TBL_KYKN_TNP_I
※テーブル除外(データのみインサートしない)オプション
 query=micmt101.TBL_FRM_FL_DAT_R:\"where FRM_KR_R_SEQ = 0\"
  queryオプション
  対象データを抽出してEXP、IMPする際に使用するオプション
  query=スキーマ名.テーブル名:\"条件式\" 
  ※条件式はSQLのWHERE区以降を記載すればOK
    条件式は「"」で括って、「"」の前にエスケープ文字(\,¥)を記載する。
  記載例
  query=micmt101.TBL_FRM_FL_DAT_R:\"where FRM_KR_R_SEQ = 0\" 

外部キー無効化

SET SERVEROUTPUT ON SIZE 20000
declare
 mysql     varchar2(500);
begin  
 dbms_output.put_line('FK_DISABLE スタート');
 for cur in (select table_name,constraint_name from user_constraints 
                                               where constraint_type = 'R'
            )   loop
    begin 
        mysql := 'alter table ' || cur.table_name || ' disable constraints ' || cur.constraint_name;
        EXECUTE IMMEDIATE mysql;
        
        exception
           when others then 
           dbms_output.put_line('NG : ' || cur.constraint_name || 'が無効化できません');
    end;      
 end loop; 
 dbms_output.put_line('FK_DISABLE エンド');
end;
/

外部キー有効化

SET SERVEROUTPUT ON SIZE 20000
declare
 mysql     varchar2(500);
begin  
 dbms_output.put_line('FK_ENABLE スタート');
 for cur in (select table_name,constraint_name from user_constraints 
                                               where constraint_type = 'R'
            )   loop
    begin 
        mysql := 'alter table ' || cur.table_name || ' enable constraints ' || cur.constraint_name;
        EXECUTE IMMEDIATE mysql;
        
        exception
           when others then 
           dbms_output.put_line('NG : ' || cur.constraint_name || 'が有効化できません');
    end;      
 end loop; 
 dbms_output.put_line('FK_ENABLE エンド');
end;
/

オブジェクトコンパイル

SET SERVEROUTPUT ON SIZE 20000
begin 
 
 dbms_output.put_line('コンパイル開始');
 for cur in (select OBJECT_NAME,OBJECT_TYPE 
             from obj 
             where status = 'INVALID' ) 
 loop 
     begin
        if cur.OBJECT_TYPE = 'PACKAGE BODY' then 
           EXECUTE IMMEDIATE 'alter ' || cur.OBJECT_TYPE || ' "' || cur.OBJECT_NAME || '" compile body'; 
        else 
           EXECUTE IMMEDIATE 'alter ' || cur.OBJECT_TYPE || ' "' || cur.OBJECT_NAME || '" compile'; 
        end if; 
     exception
        when others then null; 
     END;
 end loop;
 
 for cur2 in (select OBJECT_NAME,OBJECT_TYPE 
             from obj 
             where status = 'INVALID' ) 
 loop 
     begin
        dbms_output.put_line(cur2.OBJECT_TYPE || ' ' || cur2.OBJECT_NAME || 'が有効化できません');
     exception
        when others then null; 
     END;
 end loop;
 
 dbms_output.put_line('コンパイル終了');
end;
/

統計情報
・テーブル

SET SERVEROUTPUT ON SIZE 20000
declare
 Uname     varchar2(20);
 Tabname   varchar2(30):='TBL_KN_TKSY_KR_R';  --テーブル名を指定
begin
 
 select username into Uname from  user_users;
 dbms_output.put_line(Uname || ' : ' || Tabname);
 
 DBMS_STATS.GATHER_TABLE_STATS (
                                OWNNAME => Uname
                               ,TABNAME => Tabname
                               );
end;
/

・スキーマ

SET SERVEROUTPUT ON SIZE 20000
declare
 Uname     varchar2(20);
 a_time    varchar2(20);
 b_time    varchar2(20);
begin
 
 select username into Uname from user_users;
 select min(last_analyzed) into a_time from user_tables;
 dbms_output.put_line('スキーマ : ' || Uname);
 dbms_output.put_line('更新前last_analyzed : ' || a_time);
 
 DBMS_STATS.GATHER_SCHEMA_STATS (
                                OWNNAME => Uname
                               ,OPTIONS => 'GATHER'
                               );
 
 select min(last_analyzed) into b_time from user_tables;
 dbms_output.put_line('更新後last_analyzed : ' || b_time);
end;
/

・全スキーマ

SET SERVEROUTPUT ON SIZE 200000
declare
 Uname     varchar2(20);
 a_time    varchar2(20);
 b_time    varchar2(20);
begin
 for cur in (select username from dba_users where username in ('MICDM01','MICDM02','MICIT00','MICIT01',
                                                               'MICIT02','MICIT03','MICIT04','MICIT05',
                                                               'MICIT06','MICIT07','MICIT08','MICIT09',
                                                               'MICIT10','MICIT11','MICIT12','MICIT13',
                                                               'MICIT14','MICIT15','MICIT16','MICIT17',
                                                               'MICIT18','MICIT19','MICIT40','MICIT42',
                                                               'MICIT99','MICKN00','MICKS00','MICKS01',
                                                               'MICKW00','MICKW01','MICIT60','MICRC01',
                                                               'MICRC02','MICRC03','MICRC04','MICRC05',
                                                               'MICRC06','MICRC10','MICRC11','MICSG01'
                                                               )
                                                  order by username              
            ) loop
 select min(last_analyzed) into a_time from dba_tables where owner = cur.username;
 dbms_output.put_line('スキーマ : ' || cur.username);
 dbms_output.put_line('更新前last_analyzed : ' || a_time);
 
 DBMS_STATS.GATHER_SCHEMA_STATS (
                                OWNNAME => cur.username
                               ,OPTIONS => 'GATHER'
                               );
 select min(last_analyzed) into b_time from dba_tables where owner = cur.username;
 dbms_output.put_line('更新後last_analyzed : ' || b_time);
 end loop;                              
end;
/

自動メンテナンスタスクの機能

タスク名						説明
自動オプティマイザ統計収集		データベースオブジェクトに対する統計情報を自動的に収集する機能。 
自動セグメント・アドバイザ		再生可能な領域が存在しているセグメントを識別し、それらのセグメントの断片化を解消する方 法について推奨する機能 
自動SQLチューニング・アドバイザ	高負荷のSQL文のパフォーマンスを調査し、それらの文のチューニング方法について推奨する 機能 

・自動メンテナンスタスクの有効・無効確認

select CLIENT_NAME
     ,STATUS 
 from DBA_AUTOTASK_CLIENT;

CLIENT_NAME                                                      STATUS 
---------------------------------------------------------------- --------
auto optimizer stats collection                                  ENABLED  
auto space advisor                                               ENABLED  
sql tuning advisor                                               DISABLED 

・自動メンテナンスタスクのスケジュール確認

select s.WINDOW_NAME
     ,s.REPEAT_INTERVAL
     ,s.DURATION
     ,s.ENABLED
     ,a.AUTOTASK_STATUS
     ,a.OPTIMIZER_STATS
     ,a.SEGMENT_ADVISOR
     ,a.SQL_TUNE_ADVISOR
  from DBA_SCHEDULER_WINDOWS s,
      DBA_AUTOTASK_WINDOW_CLIENTS a
 where s.WINDOW_NAME = a.WINDOW_NAME(+);
WINDOW_NAME                    REPEAT_INTERVAL

インデックス関連

・index_Analyze.sql

⇒INDEXの状態を確認
 NAME:INDEX名
 階層:階層の深さ 
 リーフ:リーフ数(インデックスの総数)
 削除リーフ:削除されたリーフ数
 <参考> 
 階層が深く(4以上)、削除リーフがリーフ数の30%を超えるとINDEXのパフォーマンスが低下していると思う
SET SERVEROUTPUT ON SIZE 200000
declare
 index_space  varchar2(50);
 mysql     varchar2(500);
 a1      varchar2(50);
 a2      varchar2(50);
 a3      varchar2(50);
 a4      varchar2(50);
begin  
 dbms_output.put_line('NAME,階層,リーフ,削除リーフ');
 
 for cur in (select index_name from  user_indexes
                               where index_type = 'NORMAL'
            )   loop
    begin 
        mysql := 'Analyze index ' || cur.index_name || ' validate structure';
        EXECUTE IMMEDIATE mysql;
        
        select NAME, HEIGHT, LF_ROWS, DEL_LF_ROWS into a1,a2,a3,a4 from INDEX_STATS;
        dbms_output.put_line(a1 || ',' || a2 || ',' || a3 || ',' || a4);
        
        exception
           when others then null; 
    end;      
 end loop; 
end;
/

・index_check.sql

 ⇒スキーマに張られている全INDEXの設定情報(テーブル毎にどのカラムに対して設定しているか)を取得
SET SERVEROUTPUT ON SIZE 200000
begin 
 EXECUTE IMMEDIATE 'create table wk_index_check (wk1 VARCHAR2(30),wk2 NUMBER,wk3 VARCHAR2(30),wk4 NUMBER,wk5 NUMBER,wk6 NUMBER,wk7 NUMBER,wk8 NUMBER,wk9 NUMBER,wk10 NUMBER)';
 
end;
/
declare
 tab_name  varchar2(50);
 wk_table  varchar2(50);
 ind_count number;
 i_count number;
 col_count number;
 mysql_1     varchar2(500);
 mysql_2     varchar2(2000);
 mysql_3     varchar2(2000);
 mysql_4     varchar2(5000);
 wk_col1      varchar2(30) := 'INDEX1';
 wk_col2      varchar2(30) := 'INDEX2';
 wk_col3      varchar2(30) := 'INDEX3';
 wk_col4      varchar2(30) := 'INDEX4';
 wk_col5      varchar2(30) := 'INDEX5';
 wk_col6      varchar2(30) := 'INDEX6';
 wk_col7      varchar2(30) := 'INDEX7';

begin
 for cur in (select a.table_name,b.comments from user_tables a, USER_tab_COMMENTS b
                                            where a.table_name = b.table_name
                                            and a.table_name <> 'WK_INDEX_CHECK'
                                            and b.comments is not null
                                            order by a.table_name
            )   loop
    begin 
        select count(*) into ind_count from user_indexes 
                                       where table_name = cur.table_name
                                       and   index_type = 'NORMAL';                         
        dbms_output.put_line('テーブル名 :	' || cur.table_name || '	' || cur.comments || '	インデックス数 :' || ind_count);         
        if ind_count = 0 then
              dbms_output.put_line('No	カラム名	INDEX1	INDEX2	INDEX3	INDEX4	INDEX5	INDEX6	INDEX7');
              for cur2 in (select column_id,
                                  column_name 
                           from   user_tab_columns 
                           where  table_name = cur.table_name
                           order by column_id
                         ) loop
                         
                   dbms_output.put_line(cur2.column_id || '	' || cur2.column_name );
        
               end loop;
        else    
               mysql_1 := 'insert into WK_INDEX_CHECK(wk1,wk2,wk3';
               mysql_2 := ') select a.table_name,a.column_id,a.column_name';
               mysql_3 := ' from (select * from user_tab_columns where table_name = ''' || cur.table_name || ''') a';
               i_count := 1;
               col_count := 4;
               for cur3 in (select index_name from  user_indexes 
                                       where table_name = cur.table_name
                                       and   index_type = 'NORMAL'
                                       order by index_name
                    ) loop
                   
                    mysql_1 := mysql_1 || ',wk' || col_count;                 
                    mysql_2 := mysql_2 || ',i' || i_count || '.column_position "' || cur3.index_name || '"';   
                    mysql_3 := mysql_3 || ' left join (select * from user_ind_columns where index_name = ''' || cur3.index_name || ''' ) i' || i_count || ' on a.column_name = i' || i_count || '.column_name';
                    
                    case i_count
                         when 1 then wk_col1 := cur3.index_name;
                         when 2 then wk_col2 := cur3.index_name;
                         when 3 then wk_col3 := cur3.index_name;
                         when 4 then wk_col4 := cur3.index_name;
                         when 5 then wk_col5 := cur3.index_name;
                         when 6 then wk_col6 := cur3.index_name;
                         when 7 then wk_col7 := cur3.index_name;
                    end case;
                    
                    i_count := i_count + 1;
                    col_count := col_count + 1;
               end loop;
               
               mysql_4 := mysql_1 || mysql_2 || mysql_3;
               --dbms_output.put_line('SQL : ' || mysql_4); 
               EXECUTE IMMEDIATE mysql_4;
               dbms_output.put_line('No	カラム名	' || wk_col1 || '	' || wk_col2 || '	' || wk_col3 || '	' || wk_col4 || '	' || wk_col5 || '	' || wk_col6 || '	' || wk_col7); 
                              
               for cur4 in (select wk2,wk3,wk4,wk5,wk6,wk7,wk8,wk9,wk10 from wk_index_check
                                                                        where wk1 =  cur.table_name
                                                                        order by wk2
                   )loop
                   
                   dbms_output.put_line(cur4.wk2 || '	' || cur4.wk3 || '	' || cur4.wk4 || '	' || cur4.wk5 || '	' || cur4.wk6 || '	' || cur4.wk7 || '	' || cur4.wk8 || '	' || cur4.wk9 || '	' || cur4.wk10); 
               
               end loop;    

        end if;
        dbms_output.put_line('-');
        
        wk_col1 := 'INDEX1';
        wk_col2 := 'INDEX2';
        wk_col3 := 'INDEX3';
        wk_col4 := 'INDEX4';
        wk_col5 := 'INDEX5';
        wk_col6 := 'INDEX6';
        wk_col7 := 'INDEX7';      
        
        exception
           when others then null; 
    end;      
 end loop; 
 EXECUTE IMMEDIATE 'drop table wk_index_check cascade constraint purge';
end;
/

・index_rebuild.sql

 ⇒パフォーマンスの低下したINDEXの再作成を行い削除リーフをなくす
 ※全件再作成しかまだ対応していない
declare
 index_space  varchar2(50);
 mysql     varchar2(500);
begin  
 
 for cur in (select index_name from  user_indexes
             where index_type <> 'LOB'
            )   loop
    begin 
        mysql := 'alter index ' || cur.index_name || ' rebuild';
        EXECUTE IMMEDIATE mysql;
        
        exception
           when others then null; 
    end;      
 end loop; 
end;
/

・index_recreate.sql 

 ⇒作成先表領域がINDEX表領域外のINDEXをINDEX表領域に移動する。
 ※LOBINDEXは対応していない

SET SERVEROUTPUT ON SIZE 20000
declare
 index_space  varchar2(50);
 mysql     varchar2(500);
begin
 dbms_output.put_line('index_recreate スタート');
 select tablespace_name into index_space from  user_ts_quotas
                        where tablespace_name <> (select default_tablespace from user_users);
 dbms_output.put_line('インデックス表領域  ' || index_space || 'にインデックスを移動します');
 
 --LOBタイプ以外をインデックス表領域に移動
 for cur in (select * from  user_indexes
                               where index_type = 'NORMAL'
                               and   tablespace_name = (select default_tablespace from user_users) 
            )   loop
    begin 
        mysql := 'alter index ' || cur.index_name || ' rebuild tablespace ' || index_space;
        EXECUTE IMMEDIATE mysql;
        exception
           when others then null; 
    end;      
 end loop; 
 dbms_output.put_line('index_recreate エンド');
end;
/

シーケンス設定(全件)

SET SERVEROUTPUT ON SIZE 200000
declare
 tab_name  varchar2(50);
 max_seq   number;
 max_seq2  number;
 dsql      varchar2(500);
 mysql     varchar2(500);
begin 
 for cur in (select SEQUENCE_NAME from user_sequences
                                  where SEQUENCE_NAME IN (select column_name from USER_CONS_COLUMNS 
                                                                             where constraint_name in (select constraint_name from  user_constraints 
                                                                                                                              where CONSTRAINT_TYPE = 'P'
                                                                                                      )
                                                          ) 
            )   loop
    begin 
        max_seq := 1;
        dbms_output.put_line('シーケンス名 : ' || cur.SEQUENCE_NAME);
        dbms_output.put_line('SEQ使用テーブル名');
        
        for cur2 in (select table_name from  USER_CONS_COLUMNS 
                                       where column_name = cur.SEQUENCE_NAME
                                       and   constraint_name in (
                                                                 select constraint_name from  user_constraints 
                                                                                        where CONSTRAINT_TYPE = 'P'
                                                                 )
                     ) loop
             dbms_output.put_line('テーブル名 : ' || cur2.table_name);
             EXECUTE IMMEDIATE 'select max(' || cur.SEQUENCE_NAME || ') from ' || cur2.table_name
                                into max_seq2;
             if max_seq < max_seq2 then
                max_seq := max_seq2;
             end if;
        end loop;
        
        dbms_output.put_line('現最大シーケンス値 :' || max_seq);  
        if max_seq <> 1 then
           max_seq := max_seq + 1;   
        end if;
        
        dbms_output.put_line('シーケンス設定値 : ' || max_seq);
        dsql := 'drop sequence ' || cur.SEQUENCE_NAME;
        EXECUTE IMMEDIATE dsql;
        mysql := 'create sequence ' || cur.SEQUENCE_NAME || ' start with ' || max_seq;
        EXECUTE IMMEDIATE mysql;
     
        exception
           when others then null; 
    end;      
 end loop; 
end;
/

シーケンスMAX値確認

set serveroutput on
declare
  mysql varchar(500);
  rec number;
begin
dbms_output.put_line('※※※SEQ名,TBL名,SEQ最大値※※※');
for cur in (select * from user_tab_columns
            where column_name in (select object_name from user_objects
                                  where object_type='SEQUENCE'))
loop
  mysql:='select max(' || cur.column_name || ') from ' || cur.table_name;
  execute immediate mysql into rec;
  dbms_output.put_line(cur.column_name || ',' ||cur.table_name || ',' || rec);

/*
  for cur2 in (select * from user_sequences where sequence_name= cur.column_name)
  loop 
      dbms_output.put_line(cur2.last_number);
  end loop;
*/

end loop;
end;
/

ユーザKILL(PL/SQL)

SET SERVEROUTPUT ON SIZE 20000
declare
 kill_sid     varchar2(10);
 kill_serial  varchar2(10);
 kill_user    varchar2(30)  :='&1';
 mysql        varchar2(500);
 error_message  varchar2(2000);
 err_count number;
begin
 dbms_output.put_line('ユーザ削除処理 スタート');
 --セッション、シリアルの検索削除
 dbms_output.put_line('  セッション削除 開始' );
 for cur in (select sid,serial#,username from v$session
                                         where username = kill_user
             )   loop
    begin 
        mysql := 'alter system kill session '''|| cur.sid || ',' ||cur.serial# || ''' immediate';
        EXECUTE IMMEDIATE mysql;
        exception
           when others then null; 
    end;      
 end loop;
 dbms_output.put_line('  セッション削除 終了' ); 
 
 DBMS_LOCK.SLEEP(5);
 --ユーザ削除
 begin
     dbms_output.put_line('  ユーザ削除 開始');
     mysql := 'drop user ' || kill_user || ' cascade';
     EXECUTE IMMEDIATE mysql;
     dbms_output.put_line('  ユーザ削除 終了');             
     exception
       when others then
            dbms_output.put_line('  【ERROR】ユーザ削除処理にてエラーが発生しました');
            error_message := sqlerrm;
            dbms_output.put_line('            エラーメッセージ:' || error_message);
            err_count := 1;
            dbms_output.put_line('  ユーザ削除 異常終了');       
 end;
 dbms_output.put_line('ユーザ削除 エンド');
end;
/

SQL確認

【実行中のSQL】
select a.schemaname "スキーマ",
   	a.wait_class,
   	a.event,
   	trunc((sysdate - a.sql_exec_start) * 24 * 60 * 60,2) as "経過(秒)",
   	b.sql_text "SQL" 
from  gV$session a,gV$sqlarea b
where status = 'ACTIVE'
and   a.inst_id = b.inst_id
and   a.sql_id = b.sql_id
order by a.sql_exec_start
【実行中のSQL】プロセス、セッション、シリアルID付
select a.schemaname "スキーマ",
   	c.spid,
   	a.SID,
   	a.serial#,
   	a.osuser,
   	a.program,
   	trunc((sysdate - a.sql_exec_start) * 24 * 60 * 60,2) as "経過(秒)",
   	a.status,
   	b.sql_text "SQL" 
from  gV$session a,gV$sqlarea b,v$process c
where status = 'ACTIVE'
and   a.inst_id = b.inst_id
and   a.sql_id = b.sql_id
and   a.paddr = c.addr
order by 1,5,6
【過去に実行したSQL】
select parsing_schema_name "スキーマ",
   	parse_calls "解析回数",
   	executions "実行回数",
   	buffer_gets "バッファ取得数",
   	disk_reads "ディスク読取り数",
   	trunc(elapsed_time/executions,1) / 1000 "実行時間(秒)",
   	elapsed_time / 1000 "トータル経過時間(秒)",
   	sql_text "SQL" 
from v$sql
where substr(first_load_time,1,10) = '2016-10-17'  --←対象の日付を変更して使用してください。
and executions>0
order by elapsed_time desc

CURSORの使い方

set serveroutput on

declare

 CURSOR cur is
   select * from tbl_tjt_hzk_i;
 rec cur%rowtype;

begin
 open cur;

 loop
   fetch cur into rec;
   
   exit when
     cur%notfound;

   dbms_output.put_line('日付コード ' || rec.hzk_c);
   dbms_output.put_line('当日年月日 ' || rec.tjt_ymd);
   dbms_output.put_line('取引年月日 ' || rec.trk_ymd);
 end loop;

 close cur;
end;
/
---------------------------------
無名ブロック完了
日付コード 1
当日年月日 2017-10-27 00:00:00
取引年月日 2017-10-27 00:00:00
日付コード 2
当日年月日 2017-10-27 00:00:00
取引年月日 2017-10-27 00:00:00
---------------------------------

シェルからSQLファイルを呼び出し実行

do.sh
#! /bin/bash

ret=`sqlplus -s mickn00/password@mictst << eof
#set head off;
@sample.sql
exit;
eof`
echo $ret > `pwd`/test.txt

exit
sample.sql
set feed off;
set head off;
set serveroutput on;
declare
	day1 char(20);
	day2 char(20);
begin
	select to_char(sysdate,'yyyymmdd') into day1 from dual;
	select to_char(max(JSS_YTI_YMD),'yyyymmdd') into day2 from tbl_tiri_syr_jss_yti_i;
	--dbms_output.put_line(day1);
	--dbms_output.put_line(day2);

	begin
		if (day1 > day2) then
			dbms_output.put_line(day1);
		else
			dbms_output.put_line(day2);
		end if;
	end;
end;
/
・結果
[[Azure]root@micdbd01 test]# cat test.txt
20190327

カーソルForLoop

declare
  --カーソル宣言
  cursor cur is
    select table_name,tablespace_name from user_tables;
begin
  for rec in cur loop
    dbms_output.put_line(rec.table_name || ',' || rec.tablespace_name);
  end loop;
end;
/