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