我似乎遇到了一个奇怪的问题,Oracle不会存储/返回查询的完整SQL文本。当我将v$session
连接到v$sqltext
来监视当前活动查询时,我注意到所有的CREATE TABLE ____ AS
查询都有一个被截断为20个字符的sql_text
值。
例如:
SQL> SELECT sql_text, LENGTH(sql_text), sql_fulltext, LENGTH(sql_fulltext) FROM v$sql WHERE sql_id = 'sql_id_here';
SQL_TEXT LENGTH(SQL_TEXT) SQL_FULLTEXT LENGTH(SQL_FULLTEXT)
----------------------------------- ---------------- ----------------------------------- --------------------
create table schema. 20 create table schema. 20
1 row selected.
SQL> SELECT sql_text, LENGTH(sql_text) FROM v$sqltext WHERE sql_id = 'sql_id_here';
SQL_TEXT LENGTH(SQL_TEXT)
----------------------------------- ----------------
create table schema. 20
1 row selected.
SQL> SELECT sql_text, LENGTH(sql_text) FROM v$sqltext_with_newlines WHERE sql_id = 'sql_id_here';
SQL_TEXT LENGTH(SQL_TEXT)
----------------------------------- ----------------
create table schema. 20
1 row selected.
我认为这可能是一次孤立事件,所以我检查了v$sqltext
中CREATE TABLE
的所有条目:
SELECT sql_id, COUNT(*) AS entries, SUM(LENGTH(sql_text)) AS query_len
FROM v$sqltext
WHERE sql_id IN (
SELECT sql_id
FROM v$sqltext
WHERE piece = 0
AND UPPER(sql_text) LIKE 'CREATE TABLE%'
)
GROUP BY sql_id
ORDER BY 1, 2, 3
在250多个sql_id条目中,所有的
entries = 1
和query_len = 20
。然而,在查询完成后(假设我事先知道正在创建哪个表),如果我检查
dba_audit_trail
,完整的sql_text就会出现在那里。发生了什么以及如何修复这个问题,使得
v$sqltext
包含CREATE TABLE ___ AS
语句的完整查询?
编辑:经过仔细检查,所有的
GRANT
、CREATE
和ALTER
查询在v$sqltext
中都被截断为20个字符。所有其他查询都包含它们的完整文本。我正在开放一个悬赏来解决这个问题。
select sql_text from v$sqltext where sql_id = '...'
这样的语句来查看某个 sql_id 对应的视图中到底包含了什么内容吗?这样可以排除之前查询中所有可能出现的错误。如果这个视图确实只包含了查询的一部分,那么我认为这是一个 bug。 - Dmitriyv$sqltext
中的sql_text
和sql_fulltext
,以及v$sqltext_with_newlines
中的sql_text
。这似乎只是在CTAS查询中存在问题,其他所有内容都显示正常。 - Mr. Llamaselect a.*,length(a.sql_text) From v$sqltext a where upper(sql_text) like '%CREATE TABLE%';
并得到了最多64个字符的长度。ALTER
和GRANT
也是一样。我使用的是11gR2版本。 - Anjan Biswasalter user me identified by "myNewPassword";
这样的语句出现在V$SQL
中。 - Jon Heller