我正在尝试从存储过程中的dba_tab_cols视图中进行SELECT.它不起作用,我不知道为什么.
如果我执行以下SQL作为查询:
SELECT t.data_type FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
Run Code Online (Sandbox Code Playgroud)
它工作正常.但是,如果我将其复制到存储过程中,如下所示:
SELECT t.data_type INTO dataType FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
Run Code Online (Sandbox Code Playgroud)
我收到错误消息"PL/SQL:ORA-00942:表或视图不存在",编辑器在尝试编译时突出显示dba_tab_cols.在这两种情况下都使用相同的db用户.
dataType声明为:dataType varchar2(128);
PL/SQL(Oracle 9)
有人知道这个问题吗?
我们有一个表格形式:
ID,Value1,Value2,Value3
1,2,3,4
Run Code Online (Sandbox Code Playgroud)
我们需要将其转化为.
ID,Name,Value
1,'Value1',2
1,'Value2',3
1,'Value3',4
Run Code Online (Sandbox Code Playgroud)
在一个SELECT语句中是否有一种聪明的方法(即没有UNION)?列名称Value1,Value2和Value3是固定且常量的.
该数据库是oracle 9i.
没有讨论业务逻辑应该在数据库中还是在应用程序层,因为它已经被其他地方所覆盖.
我的团队正在翻译100K +行的PL/SQL代码,并将逻辑从数据库移到应用程序中.我们使用VB6直接调用Oracle 9i存储过程和Ad-hoc查询,现在使用C#,.net 3.5,Winforms和NHibernate到Oracle 9i数据库.
我们已经找到了一个很好的工具来帮助转换Ad-hoc查询SmartCode,但它只创建基于表和视图的代码.我们正在寻找一种工具来协助转换存储过程.
存储过程中包含我们要迁移到应用程序层的大部分业务逻辑.我们想知道是否有任何工具可以将存储过程转换为C#代码.
假设没有,如果我们开发内部/开源工具,最好的起点是什么.是否有其他类似的系统具有类似的目标,可以用作起点?
接受的答案更新: 我选择了范围蠕变的答案,因为它似乎是实现问题中提出的问题的最佳方法.对于那些处理同一问题的人,我衷心地推荐Adam的回应,因为他强烈主张反对使用工具并提供强有力的理由.他还提供了与这个问题最多的互动,并且得到了最多的投票反应.
感谢大家的帮助和对话.
我在SELECT语句中使用用户定义的函数时遇到了一些有趣的行为.
我有几个存储过程从单个表中读取和清除数据.这些存储过程由多个源使用.
在我的观察中,似乎用户定义的函数有时是任意评估的,并不总是在执行它所使用的SELECT语句之后或期间立即进行评估.
例如,在存储过程中,我有一个select语句可能看起来像这样:
SELECT Something, MyFunction(Something) FROM Somewhere;
Run Code Online (Sandbox Code Playgroud)
然后调用另一个存储过程,该过程从表中清除数据.清除的数据量由另一个表控制,该表存储最大ID读取.这样清除不应该删除任何尚未被执行的存储过程的另一个实例读取的数据.
在我的测试代码中,MyFunction只返回表Somewhere中的行数.因此,我认为它应该始终等于SELECT语句返回的行数.但是,在我运行此存储过程的两个实例的情况下,我得到如下结果:
第一个查询实例:
Something MyFunction(Something)
--------- ---------------------
A 3
B 3
C 3
Run Code Online (Sandbox Code Playgroud)
第二个查询实例:
Something MyFunction(Something)
--------- ---------------------
A 0
B 0
C 0
Run Code Online (Sandbox Code Playgroud)
为什么第二个查询返回所有行,但在同一个表上运行的用户定义函数报告表中没有更多行?
无论如何,我可以确保第二个查询实例是一致的,因为用户定义的函数仍然看到父存储过程看到的相同数据?
我正在尝试创建一个查询,使用PIVOT函数将行转换为列.
这是contact我想要转换成行的表:
PARTYID CONTACTTEXT CONTACTTYPECD
---------- ------------ -------------
100 0354441010 1
100 0355551010 2
100 0428105789 3
100 abc@home.com 4
Run Code Online (Sandbox Code Playgroud)
我的预期结果:
PARTYID PHONE FAX MOBILE EMAIL
---------- ------------ ------------ ------------ ------------
100 0354441010 0355551010 0428105789 abc@home.com
Run Code Online (Sandbox Code Playgroud)
我的查询:
SELECT * FROM
(
SELECT partyId, contacttext, contacttypecd
FROM CONTACT
WHERE partyId = 100;
)
PIVOT (
MAX(contacttext)
FOR contacttypecd in (1 Phone, 2 Fax, 3 Mobile, 4 Email));
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
Error starting at line 9 in command:
FOR contacttypecd in (1 …Run Code Online (Sandbox Code Playgroud) 我们有一个供应商应用程序,我们可以在其中下载他们的更新并部署一个 war 文件。我们正在运行 oracle 应用程序服务器 9i 的 unix 应用程序服务器上部署 war 文件。我相信当我们部署 war 文件时,我们会删除以前的安装,然后部署新的 war 文件。当我们部署war文件时,有时我们必须手动设置类和其他文件的unix文件权限。我们这样做是为了让所有 UNIX 用户 ID 都可以运行他们需要的进程。有一个更好的方法吗?
当我尝试连接到我的数据库时,我收到以下错误.
ORA-00257:归档错误.仅在连接内部直到释放.
直到昨天,数据库非常实用.
任何解决方法?
是否可以在不使用系统表的情况下找出块内游标或变量的列的数据类型?虽然我知道我可以使用系统表来查找此信息,但速度会慢很多。
就像是,
declare
my_column_data_type varchar2(30);
begin
my_column_data_type := all_tables.table_name%type;
dbms_output.put_line(my_column_data_type);
end;
Run Code Online (Sandbox Code Playgroud)
如果不诉诸 ,我找不到任何方法来做到这一点dbms_sql,这对于我的最终目的来说是矫枉过正的。
但是,甲骨文已经掌握了所有信息。如果我尝试将 a 分配varchar2给 anumber那么它会立即抱怨,以便它知道数据类型是什么。
而且,是的,我知道 Oracle 的版本数量很荒谬,但这就是我们目前拥有的数量……9i 很快就会消亡,取而代之的是 11,但如果我能找到答案,这段代码将立即在 9i 上运行!但我包括了 11 个,因为如果需要的话我可以等待更好的解决方案,
我在Oracle 9i数据库中有以下字符串:
A,B,C,
当它是字符串中的最后一项时,我需要替换','的所有实例.我已经提出了以下声明,但它删除了字段中的所有内容,而不仅仅是逗号.有什么建议?
UPDATE table SET column = REPLACE(SUBSTR(column, -1, 1), ',', '');
Run Code Online (Sandbox Code Playgroud) 当我尝试连接到 Oracle 9i db 时,我总是收到 ORA-1017 无效的用户名/密码;登录被拒绝。在 Oracle 10g 或更高版本上一切正常。
ODP.NET 核心:2.18.3;ASP.NET 核心:2.1.403
ConnectionString:“数据源=myTnsName;密码=myPassword;用户ID=myUserId”
TnsAdmin 已设置。
在数据库端的 Oracle 登录中,我发现了这个条目:ORA-1017 无效的用户名/密码;未知身份验证类型:6A
欢迎任何想法?可以连接吗?