带有日期和时间戳的 Oracle PL SQL 扩展类型

Oracle PLSQL extend type with date abs timestamp

我有以下代码,似乎可以正常工作。有没有办法可以在类型定义中添加日期、时间戳?如果是这样,如何引用列以便我可以将数据插入其中。例如,假设我想为每个新行向 SYSDATE 和 SYSTIMESTAMP 添加 10 秒?

 create table t ( x int );

 declare
      type numlist is table of number index by pls_integer;
      s numlist;
    begin
      for i in 1 .. 100000
      loop
        s(i) := i;
      end loop;
      forall i in 1 .. 100000
      insert into t values (s(i));
   end;
   /

使用与处理数字完全相同的方法:

create table t ( x int, y DATE, z TIMESTAMP WITH TIME ZONE );

然后

DECLARE
  TYPE numlist IS TABLE OF NUMBER;
  TYPE datelist IS TABLE OF DATE;
  TYPE timestamplist IS TABLE OF TIMESTAMP WITH TIME ZONE;
  xs numlist       := numlist();
  ys datelist      := datelist();
  zs timestamplist := timestamplist();

  n     CONSTANT PLS_INTEGER              := 100;
  nowd  CONSTANT DATE                     := SYSDATE;
  nowts CONSTANT TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
BEGIN
  xs.EXTEND(n);
  ys.EXTEND(n);
  zs.EXTEND(n);
  FOR i IN 1 .. n LOOP
    xs(i) := i;
    ys(i) := nowd + (i - 1) * INTERVAL '10' SECOND;
    zs(i) := nowts + (i - 1) * INTERVAL '10' SECOND;
  END LOOP;

  FORALL i IN 1 .. n
    INSERT INTO t (x, y, z) VALUES (xs(i), ys(i), zs(i));
END;
/

db<>fiddle here

我想这就是您要找的:

CREATE TABLE t (
  c1 INT,
  dt DATE
);

DECLARE
  TYPE numlist IS
    TABLE OF t%rowtype INDEX BY PLS_INTEGER;
  s    numlist;
  l_dt DATE := sysdate;
BEGIN
  FOR i IN 1..10 LOOP
    s(i).c1 := i;
    s(i).dt := l_dt;
    l_dt := l_dt + INTERVAL '10' SECOND;
  END LOOP;

  FORALL i IN 1..10
    INSERT INTO t (
      c1,
      dt
    ) VALUES (
      s(i).c1,
      s(i).dt
    );

END;
/

您可以像这样创建类型和类型数组

CREATE or REPLACE TYPE example_type IS OBJECT (
    your_num             NUMBER,
    time      TIMESTAMP,
    date      DATE
    );

CREATE TYPE array_of_example_type IS TABLE OF example_type;

然后你可以这样循环:

FOR i in array_of_example_type.FIRST .. array_of_example_type.LAST
LOOP 
END;

然后使用像 add_months()、add_years()、to_date() 这样的 oracle 函数来添加任何你想要的。

在 for 循环中,如果数据已经在对象中,则可以引用对象,例如:

array_of_example_type(i).your_num;
array_of_example_type(i).date;
array_of_example_type(i).time;