0

私はオラクルデータベースを使用しています。SQL サーバーには慣れていますが、Oracle データベースの PL/SQL には慣れていません。その変数の値を含むすべての行を返す変数を設定するにはどうすればよいですか? これは、私がこれに対して行った最近の試みです。

DECLARE date1 varchar(40);
Begin
Select '''07/31/2013_09%''' into :date1 from dual;
End;
/
print date1


Begin
Select * from TABLE1 where start_time LIKE date1;
End;
/

これから返されるすべての行を取得する必要があります。ご協力ありがとうございました。

4

3 に答える 3

1

これはあなたが始めるのに役立つかもしれません:

create table table1 (
  start_time varchar2(10),
  foo        number
);

insert into table1 values ('xyz', 1);
insert into table1 values ('wxy', 2);
insert into table1 values ('abc', 3);

create type table1_obj as object (
  start_time varchar2(10),
  foo        number
);
/

create type table1_tab as table of table1_obj;
/


declare
  v table1_tab;
begin

  select table1_obj(start_time, foo) bulk collect into v
   from table1 where start_time like '%x%';
end;
/
于 2013-08-01T21:41:45.033 に答える
0

いくつかの基本的な構成要素を理解していないようです。

  • データベース テーブルからクエリされたデータ セットを保存する PL/SQL データ構造が必要です: PL/SQL Collections and Records。特にネストされたテーブルレコード変数を参照してください。
  • PL/SQL Static SQLを使用してデータベースを問い合せます。特にSELECT INTOステートメントを参照してください。この場合、動的 SQL は必要ありません。
  • しかしもちろん、データベースから一連の行を取得するのは、1 つの行だけを取得するよりも少し困難です。キーワードは次のとおりです。 BULK COLLECT 句を含む SELECT INTO ステートメント。クエリとテーブルのサイズによっては、一括コレクションがサーバーのメモリを使い果たす可能性があることに注意してください (数百万行をロードすることにより)。

これはキックスタートを与えるべき例です:

create table so26 (
  day date,
  event varchar(10)
);

insert all
into so26 values(trunc(sysdate - 1), 'foo1')
into so26 values(trunc(sysdate - 1), 'foo2')
into so26 values(trunc(sysdate - 1), 'foo3')
into so26 values(trunc(sysdate    ), 'bar')
into so26 values(trunc(sysdate + 1), 'zoo')
select 1 from dual;

select * from so26;

declare
  type event_list_t is table of so26%rowtype;
  v_events event_list_t := event_list_t();

  function get_events(p_day in date default sysdate) return event_list_t as
    v_events event_list_t := event_list_t();
  begin
    select *
      bulk collect into v_events
      from so26
     where day = trunc(p_day);

    return v_events;  
  end;
begin
  v_events := get_events(sysdate + 1);

  if v_events.first is null then
    dbms_output.put_line('no events on that day');
    return;
  end if;

  for i in v_events.first .. v_events.last loop
    dbms_output.put_line(i || ': event = ' || v_events(i).event);
  end loop;
end;
/

次の場合の出力例get_events(sysdate - 1):

1: event = foo1
2: event = foo2
3: event = foo3
于 2013-08-02T06:09:31.193 に答える
0

以下のように、パラメータ化されたカーソルを作成し、その日付をパラメータとしてそのカーソルに渡す必要があります。

   CREATE or REPLACE procedure proc1(p_date date)
   as
        CURSOR C1 (date1 date)is
              SELECT * from TABLE1 where start_time LIKE date1;
  BEGIN
      FOR i in c1(p_dat)
      LOOP
        .......
      END LOOP;
      END;
于 2013-08-01T21:28:16.193 に答える