在 Oracle 11g 中立即执行
Execute Immediate in Oracle 11g
我正在尝试在 oracle 中创建一个脚本来搜索多个 table 并插入到我正在创建的临时文件 table 中,但是我在尝试这样做时遇到了一些错误数字以外的任何内容。
声明变量
m_polCount NUMBER:= 0;
m_product NUMBER:= 0;
m_version NUMBER:= 0;
m_plan NUMBER:= 0;
m_policy NUMBER:= 0;
m_pol_comm_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_pol_end_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_pol_status NUMBER:= 0;
m_next_pre_renew_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_next_renew_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_last_renew_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_cover_no NUMBER:= 0;
m_cover_name VARCHAR(240):= 'Test';
m_cover_start_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_cover_end_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_sum_assured NUMBER:= 0;
m_cover_layer NUMBER:= 0;
m_cover_prem_layer NUMBER:= 0;
m_premium NUMBER:= 0;
m_loading_type NUMBER:= 0;
m_loading_name VARCHAR(200):= 'Test';
m_basic_prem_loading SMALLINT:= 0;
m_loading_start_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_loading_end_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_loading_perc NUMBER:= 0;
m_loading_rate NUMBER:= 0;
m_loading_prem NUMBER:= 0;
m_calc_desc VARCHAR(240):= 'Test';
m_inflation_rate NUMBER:= 0;
m_agent_no NUMBER:= 0;
Table 已创建
EXECUTE IMMEDIATE '
CREATE TABLE I233_ACTIVE_P4L_POLICY_DATA
(
PRODUCT NUMBER,
VERSION NUMBER,
PLAN_NUMBER NUMBER,
POLICY_NUMBER NUMBER,
POLICY_COMM_DATE DATE,
POLICY_END_DATE DATE,
POLICY_STATUS NUMBER,
NEXT_PRE_RENEWAL_DATE DATE,
NEXT_RENEWAL_DATE DATE,
LAST_RENEWAL_DATE DATE,
COVER_NUMBER NUMBER,
COVER_NAME VARCHAR(240),
COVER_START_DATE DATE,
COVER_END_DATE DATE,
SUM_ASSURED NUMBER,
COVER_LAYER NUMBER,
COVER_PREMIUM_LAYER NUMBER,
ANNUAL_PREMIUM NUMBER,
LOADING_TYPE NUMBER,
LOADING_NAME VARCHAR(200),
BASIC_PREM_LOADING SMALLINT,
LOADING_START_DATE DATE,
LOADING_END_DATE DATE,
LOADING_PERC NUMBER,
LOADING_RATE NUMBER,
LOADING_PREM NUMBER,
PREMIUM_CALC_DESC VARCHAR(240),
INFLATION_RATE NUMBER,
AGENT_NUMBER NUMBER
)';
插入语句
EXECUTE IMMEDIATE '
INSERT INTO I233_ACTIVE_P4L_POLICY_DATA
VALUES(
'||m_product||',
'||m_version||',
'||m_plan||',
'||policy_rec.policy_no||',
'||m_pol_comm_date||', <----This field
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_pol_status||',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_cover_no||',
'''',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_sum_assured||',
'||m_cover_layer||',
'||m_cover_prem_layer||',
'||m_premium||',
'||m_loading_type||',
''TEST3'',
'||m_basic_prem_loading||',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_loading_perc||',
'||m_loading_rate||',
'||m_loading_prem||',
''TEST3'',
'||m_inflation_rate||',
'||m_agent_no||')';
错误
ORA-00917: 缺少逗号
如果我尝试以相同的方式计算日期,我会得到一个差异错误
插入语句
EXECUTE IMMEDIATE '
INSERT INTO I233_ACTIVE_P4L_POLICY_DATA
VALUES(
'||m_product||',
'||m_version||',
'||m_plan||',
'||policy_rec.policy_no||',
m_pol_comm_date, <----This field
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_pol_status||',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_cover_no||',
'''',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_sum_assured||',
'||m_cover_layer||',
'||m_cover_prem_layer||',
'||m_premium||',
'||m_loading_type||',
''TEST3'',
'||m_basic_prem_loading||',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_loading_perc||',
'||m_loading_rate||',
'||m_loading_prem||',
''TEST3'',
'||m_inflation_rate||',
'||m_agent_no||')';
给我以下错误
ORA-00984: 此处不允许列
我在尝试使用相同方法插入任何 VARCHAR 字段时也遇到了同样的问题。
有什么方法可以使用立即执行将日期/varchar 字段插入到上面创建的临时 table 中?
以上所有语句都包含在一个 BEGIN , END 块中
谢谢
假设您无法避免动态 sql,请使用绑定变量。这样,您就不必担心数据类型转换等问题。
类似于:
execute immediate '
INSERT INTO I233_ACTIVE_P4L_POLICY_DATA
VALUES(:m_product,
:m_version,
:m_plan,
:policy_rec.policy_no,
:m_pol_comm_date, <----This field
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
:m_pol_status,
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
:m_cover_no,
'''',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
:m_sum_assured,
:m_cover_layer,
:m_cover_prem_layer,
:m_premium,
:m_loading_type,
''TEST3'',
:m_basic_prem_loading,
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
:m_loading_perc,
:m_loading_rate,
:m_loading_prem,
''TEST3'',
:m_inflation_rate,
:m_agent_no)'
USING :m_product,
:m_version,
:m_plan,
:policy_rec.policy_no,
:m_pol_comm_date,
:m_pol_status,
:m_cover_no,
:m_sum_assured,
:m_cover_layer,
:m_cover_prem_layer,
:m_premium,
:m_loading_type,
:m_basic_prem_loading,
:m_loading_perc,
:m_loading_rate,
:m_loading_prem,
:m_inflation_rate,
:m_agent_no;
我正在尝试在 oracle 中创建一个脚本来搜索多个 table 并插入到我正在创建的临时文件 table 中,但是我在尝试这样做时遇到了一些错误数字以外的任何内容。
声明变量
m_polCount NUMBER:= 0;
m_product NUMBER:= 0;
m_version NUMBER:= 0;
m_plan NUMBER:= 0;
m_policy NUMBER:= 0;
m_pol_comm_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_pol_end_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_pol_status NUMBER:= 0;
m_next_pre_renew_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_next_renew_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_last_renew_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_cover_no NUMBER:= 0;
m_cover_name VARCHAR(240):= 'Test';
m_cover_start_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_cover_end_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_sum_assured NUMBER:= 0;
m_cover_layer NUMBER:= 0;
m_cover_prem_layer NUMBER:= 0;
m_premium NUMBER:= 0;
m_loading_type NUMBER:= 0;
m_loading_name VARCHAR(200):= 'Test';
m_basic_prem_loading SMALLINT:= 0;
m_loading_start_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_loading_end_date DATE:= TO_DATE('01-01-3000','DD-MM-YYYY');
m_loading_perc NUMBER:= 0;
m_loading_rate NUMBER:= 0;
m_loading_prem NUMBER:= 0;
m_calc_desc VARCHAR(240):= 'Test';
m_inflation_rate NUMBER:= 0;
m_agent_no NUMBER:= 0;
Table 已创建
EXECUTE IMMEDIATE '
CREATE TABLE I233_ACTIVE_P4L_POLICY_DATA
(
PRODUCT NUMBER,
VERSION NUMBER,
PLAN_NUMBER NUMBER,
POLICY_NUMBER NUMBER,
POLICY_COMM_DATE DATE,
POLICY_END_DATE DATE,
POLICY_STATUS NUMBER,
NEXT_PRE_RENEWAL_DATE DATE,
NEXT_RENEWAL_DATE DATE,
LAST_RENEWAL_DATE DATE,
COVER_NUMBER NUMBER,
COVER_NAME VARCHAR(240),
COVER_START_DATE DATE,
COVER_END_DATE DATE,
SUM_ASSURED NUMBER,
COVER_LAYER NUMBER,
COVER_PREMIUM_LAYER NUMBER,
ANNUAL_PREMIUM NUMBER,
LOADING_TYPE NUMBER,
LOADING_NAME VARCHAR(200),
BASIC_PREM_LOADING SMALLINT,
LOADING_START_DATE DATE,
LOADING_END_DATE DATE,
LOADING_PERC NUMBER,
LOADING_RATE NUMBER,
LOADING_PREM NUMBER,
PREMIUM_CALC_DESC VARCHAR(240),
INFLATION_RATE NUMBER,
AGENT_NUMBER NUMBER
)';
插入语句
EXECUTE IMMEDIATE '
INSERT INTO I233_ACTIVE_P4L_POLICY_DATA
VALUES(
'||m_product||',
'||m_version||',
'||m_plan||',
'||policy_rec.policy_no||',
'||m_pol_comm_date||', <----This field
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_pol_status||',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_cover_no||',
'''',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_sum_assured||',
'||m_cover_layer||',
'||m_cover_prem_layer||',
'||m_premium||',
'||m_loading_type||',
''TEST3'',
'||m_basic_prem_loading||',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_loading_perc||',
'||m_loading_rate||',
'||m_loading_prem||',
''TEST3'',
'||m_inflation_rate||',
'||m_agent_no||')';
错误
ORA-00917: 缺少逗号
如果我尝试以相同的方式计算日期,我会得到一个差异错误
插入语句
EXECUTE IMMEDIATE '
INSERT INTO I233_ACTIVE_P4L_POLICY_DATA
VALUES(
'||m_product||',
'||m_version||',
'||m_plan||',
'||policy_rec.policy_no||',
m_pol_comm_date, <----This field
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_pol_status||',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_cover_no||',
'''',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_sum_assured||',
'||m_cover_layer||',
'||m_cover_prem_layer||',
'||m_premium||',
'||m_loading_type||',
''TEST3'',
'||m_basic_prem_loading||',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
'||m_loading_perc||',
'||m_loading_rate||',
'||m_loading_prem||',
''TEST3'',
'||m_inflation_rate||',
'||m_agent_no||')';
给我以下错误
ORA-00984: 此处不允许列
我在尝试使用相同方法插入任何 VARCHAR 字段时也遇到了同样的问题。
有什么方法可以使用立即执行将日期/varchar 字段插入到上面创建的临时 table 中?
以上所有语句都包含在一个 BEGIN , END 块中
谢谢
假设您无法避免动态 sql,请使用绑定变量。这样,您就不必担心数据类型转换等问题。
类似于:
execute immediate '
INSERT INTO I233_ACTIVE_P4L_POLICY_DATA
VALUES(:m_product,
:m_version,
:m_plan,
:policy_rec.policy_no,
:m_pol_comm_date, <----This field
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
:m_pol_status,
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
:m_cover_no,
'''',
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
:m_sum_assured,
:m_cover_layer,
:m_cover_prem_layer,
:m_premium,
:m_loading_type,
''TEST3'',
:m_basic_prem_loading,
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
TO_DATE(''01-01-3000'',''DD-MM-YYYY''),
:m_loading_perc,
:m_loading_rate,
:m_loading_prem,
''TEST3'',
:m_inflation_rate,
:m_agent_no)'
USING :m_product,
:m_version,
:m_plan,
:policy_rec.policy_no,
:m_pol_comm_date,
:m_pol_status,
:m_cover_no,
:m_sum_assured,
:m_cover_layer,
:m_cover_prem_layer,
:m_premium,
:m_loading_type,
:m_basic_prem_loading,
:m_loading_perc,
:m_loading_rate,
:m_loading_prem,
:m_inflation_rate,
:m_agent_no;