在 Oracle 脚本中使用数组
Using arrays in Oracle scripts
我想创建一个脚本文件,将 INSERT/UPDATE 值写入 table。为了维护,我想创建一个数组(可能是多维的)并循环遍历它以插入记录。这是 table 列:
TABLE 姓名:REF_PROPERTY
REF_PROPERTY_ID Number PK
PACKAGE_ID Number FK
PROPERTY_NAME VarChar
PROPERTY_VALUE VarChar
OVERRIDE_VALUE Number
TABLE 名称:包
PACKAGE_ID Number PK
PACKAGE_NAME VarChar
PACKAGE_VERSION VarChar
我们有几个包 (10-15),每个包都有自己的一组属性(40-50 个属性);有些是一样的。我想为所有这些包创建一个脚本文件,而不是为每个包创建单独的脚本文件。
我想做的是这样的(写这个有点像 non-PL/SQL 格式,更多的是编码方式):
声明一个数组变量:
V_MYARR VARRAY;
myArr[1] = ['v2|v3|v4', 'property1', 'propertyValue1', 1];
myArr[2] = ['v1|v2|v3|v4', 'property2', 'propertyValue2', 0];
myArr[3] = ['v2|v3|v4|v5', 'property3', 'propertyValue3', 1];
通过执行上述操作,我可以在脚本中维护属性及其值。当我们为任何包版本添加新的 属性 时,我们把它放在这里和 运行 脚本。
假设我想要 运行 包版本 v2 的脚本。为包名和版本声明变量并获取包ID:
V_PKG_NAME VarChar := 'Package1'
V_PKG_VERSION VarChar := 'v2';
V_PKG_ID Number;
SELECT PACKAGE_ID INTO V_PKG_ID WHERE PACKAGE_NAME = V_PKG_NAME AND PACKAGE_VERSION = V_PKG_VERSION;
现在,我想遍历数组,用竖线分隔符 (|) 拆分第一个元素,检查那里是否存在版本 v2,如果存在,insert/update [=47] 中的值=].
for int arrRow in myArr
--split the first element of myArr[arrRow][0] by | and store in a new array variable splitArr
--loop through splitArr
--if V_PKG_VERSION == splitArr[I] then insert.
v2 exists in myArr[arrRow][0] so the insert would be (check if value exists before insert):
INSERT INTO REF_PROPERTY VALUES (REF_PROP_SEQ.nextval, V_PKG_ID, myArr[arrRow][1], myArr[arrRow][2], myArr[arrRow][3]);
end loop;
同样,当我想运行 包版本v3 的脚本时,我将包版本设置为v3,然后运行 脚本。
V_PKG_VERSION VarChar := 'v3';
我希望这能让我很好地了解我想要做什么,以及这是否是最小化脚本文件数量的好方法。最后,如果这样的事情在 Oracle PL/SQL.
中是可行的
提前致谢!
如果我是你,我会设置一个插入或合并语句来处理 insert/updates。
类似于:
merge into packages tgt
using (select 'Package1' package_name, 'v1' package_version from dual union all
select 'Package1' package_name, 'v2' package_version from dual union all
select 'Package1' package_name, 'v3' package_version from dual union all
select 'Package1' package_name, 'v4' package_version from dual union all
select 'Package2' package_name, 'v1' package_version from dual union all
select 'Package2' package_name, 'v2' package_version from dual) src
on (tgt.package_name = src.package_name and tgt.package_version = src.package_version)
when not matched then
insert (tgt.package_id, tgt.package_name, tgt.package_version)
values (packages_seq.nextval, src.package_name, src.package_version);
merge into ref_property tgt
using (select pkg.package_id,
property_name,
property_value,
override_value
from packages pkg
inner join (select 'Package1' package_name, 'v1' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all
select 'Package1' package_name, 'v2' package_version, 'property1' property_name, 'propertyValue1' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v2' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all
select 'Package1' package_name, 'v2' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v3' package_version, 'property1' property_name, 'propertyValue1' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v3' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all
select 'Package1' package_name, 'v3' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v4' package_version, 'property1' property_name, 'propertyValue1' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v4' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all
select 'Package1' package_name, 'v4' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v5' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v1' package_version, 'property1' property_name, 'propertyValue2' property_value, 0 override_value from dual union all
select 'Package1' package_name, 'v1' package_version, 'property4' property_name, 'propertyValue4' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v2' package_version, 'property4' property_name, 'propertyValue5' property_value, 0 override_value from dual) prop
on (pkg.package_name = prop.package_name and pkg.package_version = prop.package_version))
on (tgt.package_id = src.package_id and tgt.property_name = src.property_name)
when not matched then
insert (tgt.package_id, tgt.property_name, tgt.property_value, tgt.override_value)
values (src.package_id, src.property_name, src.property_value, src.override_value)
--optional:
when matched then
update set tgt.property_value = src.property_value,
tgt.override_value = src.override_value;
这样做的好处是您可以为每个 属性 设置不同的值,以防包的版本之间发生变化。
通过使用 MERGE
,您的脚本可以重新运行而不会弄乱内容。我在第二条语句的更新子句中添加了以防万一您希望能够更新先前设置的值。
我想创建一个脚本文件,将 INSERT/UPDATE 值写入 table。为了维护,我想创建一个数组(可能是多维的)并循环遍历它以插入记录。这是 table 列:
TABLE 姓名:REF_PROPERTY
REF_PROPERTY_ID Number PK
PACKAGE_ID Number FK
PROPERTY_NAME VarChar
PROPERTY_VALUE VarChar
OVERRIDE_VALUE Number
TABLE 名称:包
PACKAGE_ID Number PK
PACKAGE_NAME VarChar
PACKAGE_VERSION VarChar
我们有几个包 (10-15),每个包都有自己的一组属性(40-50 个属性);有些是一样的。我想为所有这些包创建一个脚本文件,而不是为每个包创建单独的脚本文件。
我想做的是这样的(写这个有点像 non-PL/SQL 格式,更多的是编码方式): 声明一个数组变量:
V_MYARR VARRAY;
myArr[1] = ['v2|v3|v4', 'property1', 'propertyValue1', 1];
myArr[2] = ['v1|v2|v3|v4', 'property2', 'propertyValue2', 0];
myArr[3] = ['v2|v3|v4|v5', 'property3', 'propertyValue3', 1];
通过执行上述操作,我可以在脚本中维护属性及其值。当我们为任何包版本添加新的 属性 时,我们把它放在这里和 运行 脚本。
假设我想要 运行 包版本 v2 的脚本。为包名和版本声明变量并获取包ID:
V_PKG_NAME VarChar := 'Package1'
V_PKG_VERSION VarChar := 'v2';
V_PKG_ID Number;
SELECT PACKAGE_ID INTO V_PKG_ID WHERE PACKAGE_NAME = V_PKG_NAME AND PACKAGE_VERSION = V_PKG_VERSION;
现在,我想遍历数组,用竖线分隔符 (|) 拆分第一个元素,检查那里是否存在版本 v2,如果存在,insert/update [=47] 中的值=].
for int arrRow in myArr
--split the first element of myArr[arrRow][0] by | and store in a new array variable splitArr
--loop through splitArr
--if V_PKG_VERSION == splitArr[I] then insert.
v2 exists in myArr[arrRow][0] so the insert would be (check if value exists before insert):
INSERT INTO REF_PROPERTY VALUES (REF_PROP_SEQ.nextval, V_PKG_ID, myArr[arrRow][1], myArr[arrRow][2], myArr[arrRow][3]);
end loop;
同样,当我想运行 包版本v3 的脚本时,我将包版本设置为v3,然后运行 脚本。
V_PKG_VERSION VarChar := 'v3';
我希望这能让我很好地了解我想要做什么,以及这是否是最小化脚本文件数量的好方法。最后,如果这样的事情在 Oracle PL/SQL.
中是可行的提前致谢!
如果我是你,我会设置一个插入或合并语句来处理 insert/updates。
类似于:
merge into packages tgt
using (select 'Package1' package_name, 'v1' package_version from dual union all
select 'Package1' package_name, 'v2' package_version from dual union all
select 'Package1' package_name, 'v3' package_version from dual union all
select 'Package1' package_name, 'v4' package_version from dual union all
select 'Package2' package_name, 'v1' package_version from dual union all
select 'Package2' package_name, 'v2' package_version from dual) src
on (tgt.package_name = src.package_name and tgt.package_version = src.package_version)
when not matched then
insert (tgt.package_id, tgt.package_name, tgt.package_version)
values (packages_seq.nextval, src.package_name, src.package_version);
merge into ref_property tgt
using (select pkg.package_id,
property_name,
property_value,
override_value
from packages pkg
inner join (select 'Package1' package_name, 'v1' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all
select 'Package1' package_name, 'v2' package_version, 'property1' property_name, 'propertyValue1' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v2' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all
select 'Package1' package_name, 'v2' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v3' package_version, 'property1' property_name, 'propertyValue1' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v3' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all
select 'Package1' package_name, 'v3' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v4' package_version, 'property1' property_name, 'propertyValue1' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v4' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all
select 'Package1' package_name, 'v4' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v5' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v1' package_version, 'property1' property_name, 'propertyValue2' property_value, 0 override_value from dual union all
select 'Package1' package_name, 'v1' package_version, 'property4' property_name, 'propertyValue4' property_value, 1 override_value from dual union all
select 'Package1' package_name, 'v2' package_version, 'property4' property_name, 'propertyValue5' property_value, 0 override_value from dual) prop
on (pkg.package_name = prop.package_name and pkg.package_version = prop.package_version))
on (tgt.package_id = src.package_id and tgt.property_name = src.property_name)
when not matched then
insert (tgt.package_id, tgt.property_name, tgt.property_value, tgt.override_value)
values (src.package_id, src.property_name, src.property_value, src.override_value)
--optional:
when matched then
update set tgt.property_value = src.property_value,
tgt.override_value = src.override_value;
这样做的好处是您可以为每个 属性 设置不同的值,以防包的版本之间发生变化。
通过使用 MERGE
,您的脚本可以重新运行而不会弄乱内容。我在第二条语句的更新子句中添加了以防万一您希望能够更新先前设置的值。