最初由 yangtingkun 发布
[B]很显然,第一个TO_NUMBER根本没有执行,你可以改成TO_DATE试试 [/B]
最初由 dba_mx 发布
[B][php]
SQL> select * from (select to_number('a') from dual);
select * from (select to_number('a') from dual)
*
ERROR 位于第 1 行:
ORA-01722: 无效数字
可以看出:如果外层查询只想或许一个内层查询的记录数的话,那么内层的表达式是不被计算的,直接统计内层表的记录数;
反之,如果希望获取内容,则表达式必然要求值,此时才发现错误;
..
[/php]
Oracle的语义分析功能蛮强啊。。。。 [/B]
最初由 cjf107 发布
[B]
SQL>select TO_NUMBER(SUBSTR(PARTITION_NAME,6)) from user_tab_partitions;
......
494
495
495
496
496
497
497
498
498
499
499
500
500
920 rows selected.
SQL>
就是执行了也没有问题。我保证分区名都是由'PART_'||一个数字
组成的,可为什么TO_NUMBER(SUBSTR(PARTITION_NAME,6))放在where子句中就报错呢?
SQL> select count(*) from user_tab_partitions
2 where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182;
where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182
*
ERROR at line 2:
ORA-01722: invalid number
SQL> [/B]
最初由 yangtingkun 发布
[B]
select /*+ no_push_pred(user_tab_partitions) */ count(*) from user_tab_partitions
where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182; [/B]
最初由 cjf107 发布
[B]
SQL> select /*+ no_push_pred(user_tab_partitions) */ count(*) from user_tab_partitions
where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182; 2
where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182
*
ERROR at line 2:
ORA-01722: invalid number
SQL> [/B]
最初由 yangtingkun 发布
[B]
数据库版本? [/B]
最初由 yangtingkun 发布
[B]看看这个吧:http://yangtingkun.itpub.net/post/468/237197
总不会三种办法对你的环境都无效吧? [/B]
最初由 yangtingkun 发布
[B]看看这个吧:http://yangtingkun.itpub.net/post/468/237197
总不会三种办法对你的环境都无效吧? [/B]
最初由 cjf107 发布
[B]SQL> select /*+ NO_MERGE(USER_TAB_PARTITIONS) */ count(*) from user_tab_partitions
2 where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182;
where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182
*
ERROR at line 2:
ORA-01722: invalid number
SQL> select /*+ no_push_pred(user_tab_partitions) */ count(*) from user_tab_partitions
where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182; 2
where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182
*
ERROR at line 2:
ORA-01722: invalid number
SQL> SELECT count(*) FROM
2 (
SELECT ROWNUM, TABLE_NAME, PARTITION_NAME, TO_NUMBER(SUBSTR(PARTITION_NAME,6)) PART
FROM USER_TAB_PARTITIONS
)
WHERE PART <=182;
3 4 5 6
COUNT(*)
----------
120
SQL>
第三种方法可以了,是因为没有将TO_NUMBER(SUBSTR())函数放在where子句,一旦放在where子句中就还是不行。
难道TO_NUMBER(SUBSTR())函数真的不能放在where子句中吗? [/B]
最初由 yangtingkun 发布
[B]看来是两个HINTS都没有生效
换个别名试试
比如
/*+ no_merge(a) */ count(*) from user_tab_partitions a [/B]
最初由 rollingpig 发布
[B]看看这个
...........
[php]
DECLARE
i NUMBER DEFAULT 0;
PARTITION_NAME VARCHAR2(100);
BEGIN
FOR a IN(SELECT PARTITION_NAME FROM user_tab_partitions_2 ) LOOP
PARTITION_NAME:=a.PARTITION_NAME;
if (TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182) THEN
i:=i+1;
END IF;
END LOOP;
Dbms_Output.put_line(i);
EXCEPTION WHEN OTHERS then
Dbms_Output.put_line('Error in row '|| i||',****' || PARTITION_NAME||'***'||SUBSTR(PARTITION_NAME,6)||'****');
END;
/
=====
Error in row 19,****asdsdaasdas***aasdas****
...
...
[/php]
楼主运行那个procedure看看? [/B]
最初由 rollingpig 发布
[B]select /*+ NO_MERGE(a) */ count(*) from
(select * from user_tab_partitions) a
where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182; [/B]
最初由 yangtingkun 发布
[B]最终结论:http://yangtingkun.itpub.net/post/468/237367 [/B]
最初由 cjf107 发布
[B]
SQL> SELECT count(*)
2 FROM USER_TAB_PARTITIONS A, DUAL B
WHERE TO_NUMBER(SUBSTR(DUMMY || PARTITION_NAME, 7)) < 182;
3
COUNT(*)
----------
118
SQL>
这样的确是可以了。
可是查看执行计划,访问的还是I_OBJ1 这个索引啊,这是为什么呢?
SQL>explain plan for SELECT count(*)
2 FROM USER_TAB_PARTITIONS A, DUAL B
3 WHERE TO_NUMBER(SUBSTR(DUMMY || PARTITION_NAME, 7)) < 182;
已解释。
SQL>SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
.......
|* 10 | TABLE ACCESS BY INDEX ROWID| OBJ$ | |
| |
|* 11 | INDEX UNIQUE SCAN | I_OBJ1 | |
| |
| 12 | TABLE ACCESS CLUSTER | SEG$ | |
| | [/B]
欢迎光临 ITPUB论坛-专业的IT技术社区 (http://www.itpub.net/) | Powered by Discuz! X3.2 |