oracle 14155,错误:ORA-14155:缺少PARTITION,PARTITIONS,SUBPARTITION或SUBPARTITIONS关键字(Error : ORA-14155: mi...

错误:ORA-14155:缺少PARTITION,PARTITIONS,SUBPARTITION或SUBPARTITIONS关键字(Error : ORA-14155: missing PARTITION, PARTITIONS, SUBPARTITION, or SUBPARTITIONS keyword)

我试图在Oracle中动态重命名列。

我有一个表的列名是月份名称,每个月我需要刷新数据并相应地更改列名称。

DECLARE

v_cur_month_name VARCHAR2(100);

i INT := 0;

vsql VARCHAR2(250);

BEGIN

FOR my_tab IN (WITH month_counter AS

(SELECT column_name, rownum AS cnt

FROM all_tab_columns

WHERE lower(owner) = 'ppl'

AND lower(table_name) = 'test')

SELECT column_name AS MONTH, cnt FROM month_counter WHERE rownum <= 12) LOOP

v_cur_month_name := to_char(to_date(extract(MONTH FROM to_date(to_char(add_months(SYSDATE, i), 'YYYY-MM-DD'), 'YYYY-MM-DD')), 'MM'), 'MONTH');

vsql := 'alter table ppl.test rename column' || my_tab.month || 'TO' || v_cur_month_name;

EXECUTE IMMEDIATE vsql;

i := i + 1;

END LOOP;

END;

对于这个:我得到错误:

ORA-14155:缺少PARTITION,PARTITIONS,SUBPARTITION或SUBPARTITIONS关键字

ORA-06512:在第20行

I m trying to rename columns dynamically in Oracle.

I have a table whose column is named on month names, every month I need to refresh the data and change column names accordingly.

DECLARE

v_cur_month_name VARCHAR2(100);

i INT := 0;

vsql VARCHAR2(250);

BEGIN

FOR my_tab IN (WITH month_counter AS

(SELECT column_name, rownum AS cnt

FROM all_tab_columns

WHERE lower(owner) = 'ppl'

AND lower(table_name) = 'test')

SELECT column_name AS MONTH, cnt FROM month_counter WHERE rownum <= 12) LOOP

v_cur_month_name := to_char(to_date(extract(MONTH FROM to_date(to_char(add_months(SYSDATE, i), 'YYYY-MM-DD'), 'YYYY-MM-DD')), 'MM'), 'MONTH');

vsql := 'alter table ppl.test rename column' || my_tab.month || 'TO' || v_cur_month_name;

EXECUTE IMMEDIATE vsql;

i := i + 1;

END LOOP;

END;

For this: i am getting error as:

ORA-14155: missing PARTITION, PARTITIONS, SUBPARTITION, or SUBPARTITIONS keyword

ORA-06512: at line 20

原文:https://stackoverflow.com/questions/47054216

更新时间:2020-01-26 22:20

最满意答案

您需要添加空格以获取正确的语法:

vsql := 'alter table ppl.test rename column' || my_tab.month || 'TO' || v_cur_month_name;

=>

vsql := 'alter table ppl.test rename column ' || my_tab.month || ' TO ' || v_cur_month_name;

无论如何,动态列重命名表示设计不佳。

You need to add spaces to get correct syntax:

vsql := 'alter table ppl.test rename column' || my_tab.month || 'TO' || v_cur_month_name;

=>

vsql := 'alter table ppl.test rename column ' || my_tab.month || ' TO ' || v_cur_month_name;

Anyway dynamic column rename indicates poor design.

2017-11-01

相关问答

我仍然不明白你为什么要移动分区,无论如何我有一个解决方案。 首先,你可以解决一个分区 SELECT COUNT(*) FROM PROVA_LOG PARTITION (SYS_P7138);

或者你可以这样做 SELECT COUNT(*) FROM PROVA_LOG PARTITION FOR (TO_DATE('2016-10-01', 'YYYY-MM-DD'));

或者如果你喜欢DATE文字 SELECT COUNT(*) FROM PROVA_LOG PARTITION FOR

...

当您正在进行分区交换时,您正在交换: 一个带有非分区表的分区表 一个带分区表的子分区表。 所以你需要在你的案例中使用两个步骤。 你将有一个分区的虚拟表。 那你会的 交换table_1 partition_1虚拟Exchange table_2 partition_1虚拟 你会重复所有的分区。 When you are doing a partition exchange, you are exchanging either: a partitioned table with a non parti

...

这不是如何删除Oracle中的重复项。 灵感,但不适用于该数据库。 像这样的东西: delete error_table et

where et.inserted_date >= date '2017-08-01' and

et.inserted_date <= date '2017-08-11' and

rowid > (select min(et2.rowid)

from error_table et2

...

首先,我质疑PARTITIONing是否有用。 你的应用程序喜欢什么? 其次,我从来没有找到SUBPARTITION ,所以我质疑子子分区是否也适用于我们。 我只发现了PARTITIONing加快SELECT两种情况。 我可以提到关于管理员的事情由PARTITIONing帮助的3种情况。 更多讨论 。 请解释你的分区目的。 First, I question whether PARTITIONing is useful at all. What is your application like?

...

你可以这样试试:使用INTERVAL来告诉oracle创建自动分区。 你必须定义列(数字或日期)和间隔(在我的例子中是1个月)。 Oracle将以相同的时间间隔(在本例中为同一个月)将所有行放入同一分区。 如果该分区不存在将被创建。 create table log(

id_dispositive number,

date date,

status number,

type number

)

partition by ra

...

与您的断言相反,第一个表无错误地工作,将示例数据插入其中: INSERT INTO `ox_data_archive_20120108` VALUES (1, 2, 3, '2012-01-31 04:10:03');

导致与第二个表相同的错误。 错误中给出的值(734898)恰好是to_days('2012-01-31') 。 您收到此错误的原因是您在2010年1月1 日至3日期间只有分区。示例数据的日期和年份都在定义的分区之外。 而不是TO_DAYS (返回从第0年到给定日期的天数),您可能

...

您需要添加空格以获取正确的语法: vsql := 'alter table ppl.test rename column' || my_tab.month || 'TO' || v_cur_month_name;

=>

vsql := 'alter table ppl.test rename column ' || my_tab.month || ' TO ' || v_cur_month_name;

DBFiddle演示 无论如何,动态列重命名表示设计不佳。 You need to add s

...

对于 select b.CityName, a.val1, a.val2

from DataRepo a

left join City b on a.CityID = b.CityID

where (a.LogTime >= '2015-08-01 00:00:00'

and a.LogTime <= '2015-08-05 00:00:00' )

and a.RegionID = 1

and a.ProvinceID =

...

使用ALL_IND_PARTITIONS.TABLESPACE_NAME而不是ALL_PART_INDEXES.DEF_TABLESPACE_NAME 。 Use ALL_IND_PARTITIONS.TABLESPACE_NAME instead of ALL_PART_INDEXES.DEF_TABLESPACE_NAME.

如果IPA_PRCADJ_HDR已存在则... insert into IPA_PRCADJ_HDR select * from DUAL

如果要根据DUAL中的记录创建IPA_PRCADJ_HDR ... create table IPA_PRCADJ_HDR as select * from DUAL

If IPA_PRCADJ_HDR already exists then ... insert into IPA_PRCADJ_HDR select * from DUAL

If

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值