我似乎遇到了一个奇怪的问题,Oracle没有存储/返回查询的完整SQL文本。当我注意到所有v$session
个查询的v$sqltext
值都被截断为20个字符时,我正在监控当前有效的查询CREATE TABLE ____ AS
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.
我认为这可能是一个孤立的事件,因此我检查了CREATE TABLE
中所有 v$sqltext
个条目:
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个字符。所有其他查询都包含其全文。我打开奖金,希望能够深究这一点。
答案 0 :(得分:3)
这看起来像是11.2.0.4的已知问题。如果您有权访问My Oracle Support,请查看错误19634213;和错误18431964,20308798和18245071(不公开)。我显然无法详细说明或重现他们所说的话。根据nop77svk的评论,它可能已在12c中修复,但也可能是特定于平台的。
如果这导致了问题,您需要向Oracle提出服务请求以验证您是否正在尝试相同的事情,并找出补丁是否可用。