【发布时间】:2017-02-06 16:08:23
【问题描述】:
我正在尝试在 oracle 中创建一个脚本来搜索多个表并插入到我正在创建的临时表中,但是在尝试执行除数字以外的任何操作时出现一些错误。
声明变量
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;
表已创建
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 字段插入到上面创建的临时表中?
以上所有语句都包含在一个 BEGIN , END 块中
谢谢
【问题讨论】:
-
你为什么使用动态sql而不是静态sql语句?为什么要动态创建表,而不是使用永久表(如果您只需要保留会话的结果然后将其丢弃,则可能是全局临时表 (GTT))?
-
要诊断您的问题,您应该使用 dbms_output.put_line(或您喜欢的任何调试方法)来找出动态执行的字符串是什么。这将有助于诊断问题。但是如果我是你并且我必须使用动态 sql,我会使用绑定变量。 (您收到错误的原因可能是因为您没有在将日期连接到可执行语句之前将日期显式转换为字符串,然后将它们重新转换回语句中的日期。)