初学Oracle,使用的是.Net(C#)进行开发,有一些问题,请高手指点迷津:
1、Oracle存储过程不能返回记录集,如果要获得记录集只能返回游标,如果要返回游标只能将存储过程建在包中吗?直接建的存储过程能不能返回游标?
2、可选条件的查询SQL语句怎么写比较好?以前在MSSQL中都是用拼字符串的,比如:
IF @FIELD1 IS NULL SET @FILED1=0
DECLARE @STR NVARCHAR(MAX)
SET @STR=N'SELECT * FROM AAA WHERE @FIELD1 + '=0 OR FIELD1='+@FILED1 
EXECUTE @STR
以上的语句ORACLE里面用什么样的方法可以等价实现?
3、在.Net中是要提交事务程序就死在那了。为什么?如何解决啊?
4、使用SQL语句如何取得数据库中(或某用户)中的所有表?类似MSSQL中的select * from sys_objects
5、如何取得某表的字段列表、类型、长度等?类似MSSQL中的select * from sys_columns
6、远程连接服务器的链接字符串怎么写?现在只能在本机链接。

解决方案 »

  1.   

    1. 9i及以后存储过程可以直接返回resultsetcreate or replace procedure test_cursor(out_cursor out SYS_REFCURSOR)
    is
    begin
        open  out_cursor for
        select t.* from emp t;
    end;2. 在oracle中也是先拼好sql,再执行,如何执行看oci开发手册3. 有可能是你的程序有问题啊,看看数据库后台发生了什么
      

  2.   

    回楼上,执行到dbcon.Commit();这一句时程序就停在这儿了,感觉事务被挂起了,即没有提交也没有回滚。在SQLplus中执行查询查不到添加的数据,但中断程序后再运行程序中的查询语句,居然可以查出刚才提交的两条数据,很奇怪(执行的存储过程是插入三条记录,其中插入第三条时的语句是有问题的)
      

  3.   

    检查一下,是不是数据库有死锁commit是被挂住,不是简单的被锁,如果是锁,应该在执行update的时候就停住的,而不是commit的时候。有可能是死锁发生了。
      

  4.   

    没有报任何错误,就是停在那不动了。
    另外请问inthirties,死锁后解锁如何操作?
      

  5.   

    如果是有plsql developer的话,可以到session里把挂住的session杀掉,很方便的如果没有plsql developer的话,参考这个贴昨天刚刚回答一个网友后总结的一个帖
    http://bbs.inthirties.com/forum-29-1.htmloracle长事务,死锁问题
      

  6.   


    1,用select v.SID,v.SERIAL#,v.STATUS,v.MACHINE, v.WAIT_TIME from v$session v where v.USERNAME='ADD114' and v.MACHINE like '%SKYMAN%';
    sql语句查出进程。2,直接用alter system kill session (sid,seral#)直接杀掉sessioin吧!
      

  7.   

    仔细检查发现在程序中或使用Toad执行插入语句都会死在那,
    是程序定住不动了,不返回任何错误信息。
    但在SQL*Plus里面执行同样的语句是可以正常执行的。
    这是什么原因?还是我ORACLE装的有问题?
    执行的语句如下:
    INSERT INTO UserInfo (UserID, UserName) VALUES ('chenxi', '晨曦')
      

  8.   

    在SQL*Plus里面执行同样的语句是可以正常执行的这个应该 不是 Oracle 的问题
      

  9.   

    4、使用SQL语句如何取得数据库中(或某用户)中的所有表?类似MSSQL中的select * from sys_objects --select* from dba_tables where owner='???'
    5、如何取得某表的字段列表、类型、长度等?类似MSSQL中的select * from sys_columns 
    --select* from dba_tab_columns where table_name='???'6、远程连接服务器的链接字符串怎么写?现在只能在本机链接。
    --这是说用客户端连服务器,如果是这样子字符串也不用写了,直接下载工具:PL sql developer
      

  10.   

    4、使用SQL语句如何取得数据库中(或某用户)中的所有表?类似MSSQL中的select * from sys_objects --select* from dba_tables where owner='???' 
    select * from user_objects;5、如何取得某表的字段列表、类型、长度等?类似MSSQL中的select * from sys_columns 
    --select* from dba_tab_columns where table_name='???' 
    select * from user_tab_columns6、远程连接服务器的链接字符串怎么写?现在只能在本机链接。 
    --这是说用客户端连服务器,如果是这样子字符串也不用写了,直接下载工具:PL sql developer
    要可以远程连接,必须先装好oracle的客户端,然后配置正确的tnsname,用sqlplus user/pwd@yourtnsname的方式就可以了,如果不愿意装客户端的话,可以用一个java提供的工具通过thin的方式连接。
      

  11.   

    4、使用SQL语句如何取得数据库中(或某用户)中的所有表?类似MSSQL中的select * from sys_objects 
    select * from all_all_tables;
    5、如何取得某表的字段列表、类型、长度等?类似MSSQL中的select * from sys_columns 
    select * from all_tab_columns;
    6、远程连接服务器的链接字符串怎么写?现在只能在本机链接。
    create database link 数据库链接名 connect to 用户名 identified by 密码 using 'tns';
      

  12.   

    非常感谢楼上各位耐心回答,关于第六个问题:
    6、远程连接服务器的链接字符串怎么写?现在只能在本机链接。
    我的程序使用C#开发的,但WEB服务器和数据库不放在同一台机器中,因此需要远程连接,这个必须要装客户端才行吗?还有16楼的使用create database link是在哪里执行?
      

  13.   

    web服务器和数据库不在一台机器上好像没有必要远程连接吧。你直接通过程序连接数据库不就可以吗。远程连接通常用于跨数据库的情况。客户端机器可以不用装oracle客户端。