如何获取为调试而编译的存储过程/函数列表?
我在下表中没有看到相关列。
- DBA_PROCEDURES
- DBA_OBJECTS
如何获取为调试而编译的存储过程/函数列表?
我在下表中没有看到相关列。
我正在尝试在测试虚拟机中克隆我们的生产数据库。我们的生产数据库使用 ASM。我想在测试数据库中使用普通文件系统。
我创建了数据库、服务、pfile 等。我将生产数据库控制文件提供给测试数据库。现在我正在尝试重命名测试数据库中的数据文件。我收到以下错误。
SQL> startup mount;
.....
SQL> alter database rename file '+NEWDATA/XX/XX01.dbf' to 'M:\oracle\datafiles\XX\XX01.dbf'; alter database rename file
'+NEWDATA/XX/XX01.dbf' to 'M:\oracle\datafiles\XX\XX01.dbf';
* ERROR at line 1: ORA-01511: error in renaming log/data files ORA-01141: error renaming data file 162 - new file
'M:\oracle\datafiles\XX\XX01.dbf' not found ORA-01110: data file 162:
'+NEWDATA/XX/XX01.dbf' ORA-27046: file size is not a multiple of
logical block size OSD-04012: file size mismatch O/S-Error: (OS 4) The
system cannot open the file.
我的备份是正常的 rman 备份,而不是作为副本备份。我正在尝试重命名不存在的文件。在这个重命名过程之后,我将尝试从 rman 备份中恢复数据库。但是这个备份不是一个个的拷贝。
我想使用Oracle Data Dictionary Views在 oracle 数据库中查找计算列列表。
我想添加更多信息。假设我在数据库中有以下计算/计算列。
ALTER TABLE HR.EMPLOYEES
ADD FULL_NAME AS ( FIRST_NAME || ' ' || LAST_NAME);
我可以在 Select Statements 中选择此列值。
SELECT EMPLOYEE_ID,FULL_NAME FROM HR.EMPLOYEES;
结果
... 174 艾伦·亚伯 ...
我可以在 TAB_COLUMNS 视图中看到此列。
select * from all_tab_columns C
WHERE
1 = 1
AND C.table_name = 'EMPLOYEES'
AND C.OWNER = 'HR'
AND COLUMN_NAME = 'FULL_NAME'
;
我想找到给定的架构、表和列,如果该列是计算/计算的?
我错误地认为INDEXES视图给了我这个信息。但以下选择不返回任何行。这仅给出功能索引。
SELECT index_name,index_Type,I.*
FROM ALL_indexes I
WHERE
1 = 1
AND INDEX_TYPE LIKE 'FUNCTION-BASED%'
AND I.OWNER = 'HR'
专家系统是人工智能的一个分支。这些系统试图通过一组规则来获取专家的知识。大多数规则都是用自然语言表述的。但它们需要由规则引擎解释,因此它们是经典 if-then-else 形式的语句。
IF
THEN
ELSE
这个特定的专家系统将保存物质和患者。每个规则根据患者的属性给出建议,存储在数据库中。
例如:
IF (PatientWeight < 50 AND PatientSex = Male AND DaysInTreatment = 0)
THEN SUBSTANCE_X = 10
IF (PatientWeight < 50 AND PatientSex = Male AND DaysInTreatment > 0)
THEN SUBSTANCE_X = 20 + DaysInTreatment *5
我从来没有设计过这样的系统。你能给我一些阅读的起点吗?或者有什么建议吗?
LOB_DATA : varbinary(max),varchar(max), image , text 列。
我有 4 个表,其中包含大量 LOB_DATA。我想将这些表中的 LOB_DATA 移动到不同硬盘中的不同文件组。
我在这个文件组中创建了一个新的文件组和文件。我还使用 了这个问题中的 sql 命令。但是 varbinary 列存储仍保持在原来的位置。
-- To move table data to new filegroup
CREATE UNIQUE CLUSTERED INDEX PK_YourTableName
ON dbo.YourTableName(YourPKFields)
WITH (DROP_EXISTING = ON) ON [NewFilegroup]
我使用以下 sql来查看 lob_data 的文件组。
-- To see lob_data filegroups
SELECT OBJECT_NAME(object_id) as OBJECT_NAME, FILEGROUP_NAME(data_space_id) as
FILE_GROUP_NAME, type_desc
FROM sys.partitions p
JOIN sys.allocation_units a
on p.partition_id = a.container_id
WHERE
type_desc = 'LOB_DATA'
我正在使用 SQL Server 2008。
我找到了以下解决方案how-to-move-the-lob-data-from-one-file-group-to-other。是否存在另一种方法?
通常在 java 或 C# 中,我会在尝试捕获错误时使用以下构造。
C# 和 Java 中的错误异常处理
try
{
// do something
}
catch(Exception ex)
{
}
Java 和 C# 中的良好异常处理
try
{
}
catch(ArgumentException ex)
{
log(ex);
// java throw
throw ex;
// in C#, throw only, is better since it keeps stack trace
throw;
}
catch(Exception ex)
{
// this is catch ALL others block
log(ex);
// java throw
throw ex;
// in C#, throw only, is better since it keeps stack trace
throw;
}
在 C# 和 java 中,我会使用日志库。java:log4j,见其他 https://stackoverflow.com/questions/3042450/what-log4j-alternative-logging-libraries-are-available
.Net:log4net、Nlog 等
在 PL/SQL 中
错误的异常处理
BEGIN
-- Do Something
EXCEPTION -- exception handlers begin
WHEN ZERO_DIVIDE THEN
null;
WHEN OTHERS THEN
null;
END;
良好的异常处理
BEGIN
-- Do Something
EXCEPTION -- exception handlers begin
WHEN ZERO_DIVIDE THEN
LOG
RAISE
WHEN OTHERS THEN
LOG
RAISE
END;
一个简单的谷歌搜索带来 log4plsql 包:http ://log4plsql.sourceforge.net/
Oracle 错误处理文档未提供有关日志记录的提示。
它给出以下句子并使用 dbms_output.put_line 进行日志记录:
“有时,您想重新引发异常,即在本地处理它,然后将其传递给封闭块。例如,您可能希望回滚当前块中的事务,然后在封闭块中记录错误。 "
我在询问有关操作系统的更多信息。那我就想一个通用的sql能不能给出这个信息呢?我想到了以下事情。
我的测试数据库输出如下。
SQL> SELECT banner from V$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
PL/SQL Release 11.2.0.2.0 - Production
CORE 11.2.0.2.0 Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
SQL> SELECT LOG_MODE ,PLATFORM_ID,PLATFORM_NAME FROM V$DATABASE;
LOG_MODE PLATFORM_ID PLATFORM_NAME
------------ ----------- -------------------
NOARCHIVELOG 10 Linux IA (32-bit)
我有以下示例查询。
variable pStartDateBegin VARCHAR2(10);
variable pEndDateFinish VARCHAR2(10);
begin
select '01-01-2000', '30-11-2011'
into :pStartDateBegin,:pEndDateFinish
from dual;
end;
-- SELECT :pStartDateBegin,:pEndDateFinish FROM dual;
WITH EXAMPLE
AS
(
SELECT OWNER,TABLE_NAME FROM DBA_TABLES T
WHERE T.LAST_ANALYZED BETWEEN :pStartDateBegin AND :pEndDateFinish
)
SELECT * FROM EXAMPLE;
当我使用 TOAD 运行此查询时。它运行成功。
XXXX rows selected.
Time End: 06.12.2011 12:05:37
Elapsed Time for Script Execution: 3 secs
在 SQL Developer 中,我收到以下错误。
Error report:
ORA-06550: line 12, column 2:
PLS-00103: Encountered the symbol "WITH"
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
在 sqlplus 中,我有类似的错误。
ATILLA@DENEME > @WithAndBindVariablesExample.sql
WITH EXAMPLE
*
ERROR at line 12:
ORA-06550: line 12, column 1:
PLS-00103: Encountered the symbol "WITH"
如果我使用以下符号
variable pStartDateBegin VARCHAR2(10);
variable pEndDateFinish VARCHAR2(10);
exec :pStartDateBegin := '01-01-2000';
exec :pEndDateFinish := '30-11-2011';
WITH EXAMPLE
AS
(
SELECT OWNER,TABLE_NAME FROM DBA_TABLES T
WHERE T.LAST_ANALYZED BETWEEN to_date(:pStartDateBegin,'DD-MM-YYYY') AND to_date(:pEndDateFinish,'DD-MM-YYYY')
)
SELECT * FROM EXAMPLE;
它成功运行所有三个工具。
看来我缺乏这方面的基本知识。我想要有关此行为、解释等的教程的指针。
我有一个相当复杂的查询。我写了两个不同的查询来实现我的目标。第一个是使用 WITH,另一个是使用全局临时表。
第一:
WITH A
(
KNO
..
)
, B
(
KNO
...
)
, C
(
KNO
...
)
SELECT * from
A INNER JOIN B
on A.KNO = B.KNO
INNER JOIN C
on B.KNO = C.KNO
第二个:
Truncate Table tempA;
Truncate Table tempB;
Truncate Table tempC;
INSERT INTO tempA SELECT -- Same select which constructs WITH A
INSERT INTO tempB SELECT -- Same select which constructs WITH B
INSERT INTO tempC SELECT -- Same select which constructs WITH C
SELECT * from
tempA A INNER JOIN tempB B
on A.KNO = B.KNO
INNER JOIN tempC C
on B.KNO = C.KNO
他们是平等的。我的意思是我观察到他们两个的查询时间相同。但是当我将 KNO 索引添加到 tempA、tempB、tempC 临时表时。第二个暴涨。
我的意思是:它变得更快,很多。我查询 1 年的值。使用 WITH:大约 58 分钟。使用带有 INDEX 的 Temp Table:大约 30 分钟。
下面给出了 4 个月值的查询时间。
使用 WITH
DENEME@DENEME Finished 15:37:02 15:40:38 03:36 mins Select 500 WITH A
总计:216000 毫秒
使用临时表 + 索引
DENEME@DENEME Finished 15:41:54 15:41:55 1 sec Select 500 WITH D
DENEME@DENEME Finished 15:41:38 15:41:38 665 msecs Insert 34660 INSERT INTO C
DENEME@DENEME Finished 15:41:21 15:41:35 14 secs Insert 34660 INSERT INTO B
DENEME@DENEME Finished 15:41:17 15:41:17 109 msecs Insert 1804 INSERT INTO A
DENEME@DENEME Finished 15:41:12 15:41:12 33 msecs Unknown 0 TRUNCATE TABLE C
DENEME@DENEME Finished 15:41:12 15:41:12 39 msecs Unknown 0 TRUNCATE TABLE B
DENEME@DENEME Finished 15:41:11 15:41:11 203 msecs Unknown 0 TRUNCATE TABLE A
总计:16049 毫秒
我的问题是:
我可以提示 oracle 在构建 WITH 临时表时添加索引吗?
sql server 中的聚集索引,如字典或电话簿。A,B,C,D 继续。
如果你查找一个名字 Ozgur 你开始 O 然后 z 等等。
我想为精通 oracle 的用户简单解释一下这个概念。
有关 Sql Server 中的聚集索引的更多信息。 什么是聚集索引?