精华内容
下载资源
问答
  • 关于处理小数点位数的几个oracle函数() 1. 取四舍五入的几位小数 select round(1.2345, 3) from dual; 结果:1.235 2. 保留两位小数,只舍 select trunc(1.2345, 2) from dual; 结果:1.23 select trunc(1.2399, 2) ...
    (转载,未找到原文地址)
    关于处理小数点位数的几个oracle函数()
    1. 取四舍五入的几位小数
    select round(1.2345, 3) from dual;
    结果:1.235
    2. 保留两位小数,只舍
    select trunc(1.2345, 2) from dual;
    结果:1.23
    
    select trunc(1.2399, 2) from dual;
    
    结果:1.23
    3.取整数
    返回大于或等于x的最大整数:  
            SQL>         select         ceil(23.33)         from         dual;  
    结果:   24 
    
     
    
    返回等于或小于x的最大整数:  
            SQL>         select         floor(23.33)         from         dual;  
    结果:   23  
       
    返回舍入到小数点右边y位的x值:rcund(x,[y])  
            SQL>         select         round(23.33)         from         dual;  
    结果:    23  
       
    返回截尾到y位小数的x值:trunc(x,[y])  
            SQL>         select         trunc(23.33)         from         dual;  
    结果:   23 
    
    
    格式化数字
    
     The following are number examples for the to_char function.
    
    
      to_char(1210.73, '9999.9') would return '1210.7'
      to_char(1210.73, '9,999.99') would return '1,210.73'
      to_char(1210.73, '$9,999.00') would return '$1,210.73'
      to_char(21, '000099') would return '000021'
    
    
    to_char函数特殊用法
      to_char(sysdate,'d') 每周第几天
      to_char(sysdate,'dd') 每月第几天
      to_char(sysdate,'ddd') 每年第几天
      to_char(sysdate,'ww') 每年第几周
      to_char(sysdate,'mm') 每年第几月
      to_char(sysdate,'q') 每年第几季
      to_char(sysdate,'yyyy') 年
      比如要找某个时间为每周第几天就可以
      SQL> select to_char(to_date('20070101','yyyymmdd'),'d') from dual;
    
    1.instr
    
     
    
    在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置。
    
     
    
    语法如下:instr( string1, string2 [, start_position [, nth_appearance ] ] )
    
     
    
    string1 源字符串,要在此字符串中查找。
    
    string2 要在string1中查找的字符串.
    
    start_position 代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1. 字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。
    
     
    
    nth_appearance 代表要查找第几次出现的string2. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。
    
    
    注意:
    
    如果String2在String1中没有找到,instr函数返回0.
    
     
    
    应用于:
    
    Oracle 8i, Oracle 9i, Oracle 10g, Oracle 11g
    举例说明:
    
    select instr('abc','a') from dual;    -- 返回 1 
    select instr('abc','bc') from dual; -- 返回 2
    select instr('abc abc','a',1,2) from dual; -- 返回 5
    select instr('abc','bc',-1,1) from dual; -- 返回 2
    select instr('abc','d') from dual; -- 返回 0
    
     
    
    

    注:也可利用此函数来检查String1中是否包含String2,如果返回0表示不包含,否则表示包含。

    二。

    如果Oracle number类型查询要求从数据库查出来的数保持到小数点后2位,然后直接再前台展示   那么我们可以采用如下查询方法:    例子:

      select fpdm,     fphm,     fkdw,     to_char(kprq, 'yyyy-mm-dd'),     to_char(xxhj, 'FM9999999999990.00'),     Decode(fpzt, '1', '正票', '2', '红票', '3', '废票')       from wskp_fpkj_zbxx_111000861071      where 11 = 1        and nsrsbh = '110999999999999'     

      其中的xxhj是number类型,我们可以将其通过 to_char(xxhj, 'FM990.00'),保持小树点后最少2位,小数点前面做多3位,最少1位;   又如 to_char(xxhj, 'FM9990.0099'),就是保持小数点后最少2位,最多4位,小数点前面做多4位,最少1位

    展开全文
  • select (case when 第二字段 is not null then 第二字段 else 第一字段 end) 字段名 from table_name;
    select 
    (case when 第二字段 is not null  then 第二字段 else 第一字段 end) 字段名 from table_name;
    展开全文
  • oracle查询测试题

    千次阅读 2016-09-01 22:57:09
    自己做过的oracle查询题目: 问题: 1, 找出没过“黎明”老师的所有学生姓名。 2, 列出2门以上(含2门)不及格学生姓名及平均成绩。 3, 既学过1号课程又学过2号课所有学生的姓名。 4, 查询每门功课...

    自己做过的oracle查询题目:

    问题:

    1,  找出没选过“黎明”老师的所有学生姓名。

    2,  列出2门以上(含2门)不及格学生姓名及平均成绩。

    3,  既学过1号课程又学过2号课所有学生的姓名。

    4, 查询每门功课成绩最好的前两名

    5, 查询出只选修了一门课程的全部学生的学号和姓名

    6, 查询课程编号“c002”的成绩比课程编号“c001”课程低的所有同学的学号、姓名

    7, 查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名

    8,查询选修‘张三’老师所授课程中成绩最好的学生姓名,课程编号和成绩。

    9, 查询所有学生都选修的课程编号和课程名称(选作)

    10, 查询学完所有课程的学生学号和姓名(选作)

    自己的答案:

    --1题 找出没选过“黎明”老师的所有学生姓名

    select s.sname from s where sno notin(select t1.sno from sc t1 join c t2 on t1.cno = t2.cno where t2.cteacher='黎明')

    --2题 列出2门以上(含2门)不及格学生姓名及平均成绩

    select s.sname,t1.avgfen from s,(selectsc.sno,avg(scgrade) as avgfen from sc where sc.sno in (select sno from sc wherescgrade<60 group by sno having count(cno)>=2) group by sc.sno) t1 wheret1.sno = s.sno

     

    --3题 既学过1号课程又学过2号课所有学生的姓名

    --使用intersect关键字

    select sname from s,sc

    where s.sno=sc.sno and sc.cno =(select cnofrom c where c.cname='高数')

    intersect

    select sname from s,sc

    where s.sno=sc.sno and sc.cno =(select cnofrom c where c.cname='化学');

    --4题 查询每门功课成绩最好的前两名

    select s.sname,s.sno,t.cno from (selectsno,cno,scgrade,row_number() over(partition by cno order by scgrade desc) asrowno from sc) t ,s where t.sno = s.sno and rowno<3

    --用over partition by 我就可以查询到每位员工本来的具体信息和它所在部门的总工资:

    --select name,dept,salary,sum(salary) over(partition by dept) total_salary from salary;

    --用goup by 就没办法做到这点,只能查询到每个部门的总工资:

    --select dept,sum(salary) total_salary fromsalary group by dept

    --第五题 查询出只选修了一门课程的全部学生的学号和姓名

    select s.sno,s.sname from s where s.snoin(select sc.sno from sc group by sc.sno having count(sc.cno)=1)

    --第六题 查询课程编号“c002”的成绩比课程编号“c001”课程低的所有同学的学号、姓名

    --感觉这一题有歧义,可能比的是一个学生的2001成绩比2002成绩高,也肯能比的是2001成绩比2002成绩高德学生

    --同一学生的比较

    select s.sno,s.sname

    from s, (select s.sno,scgrade from s,scwhere s.sno=sc.sno and sc.cno='2001') r1,(select s.sno,scgrade from s,sc wheres.sno=sc.sno and sc.cno='2002') r2

    where r1.sno=r2.sno and s.sno = r1.sno ands.sno = r2.sno and r1.scgrade > r2.scgrade

    group by s.sno,s.sname;

    --不同的学生

    select sno from sc where cno = 'c001' andsc.score >any (select score from sc where cno = 'c002');

    --第七题查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名

    --下面这个不对

    select distinct s.sno,s.sname

    from sc,s

    where s.sno=sc.sno and cno in (select cnofrom sc where  sno='1001');

    --这个是正确的

    --使用了自连接的思想

    select s.sno,s.sname from s where s.sno in(SELECT a.sno FROM sc a,sc b  WHERE a.sno<> '1001' AND b.sno = '1001' AND a.cno = b.cno  GROUP BY a.sno  HAVING COUNT(*) = (SELECT COUNT(*)  FROM sc c WHERE c.sno = '1001'))

     

    --第八题查询选修‘张三’老师所授课程中成绩最好的学生姓名,课程编号和成绩

    --这个语句中rownum这里出现问题

    select s.sname,c.cno,sc.scgrade

    from s,c,sc

    where s.sno=sc.sno and c.cno=sc.cno andc.cteacher='黎明' and rownum =1

    group by c.cno,s.sname,sc.scgrade;

    --自己写的

    select t.sno,t.scgrade,t.cno,s.sname from(select t1.*,rownum rowno from(select sc.sno,sc.scgrade,sc.cno  from sc where sc.cno=(select c.cno from cwhere c.cteacher = '黎明') order by sc.scgrade desc) t1) t ,s where s.sno = t.sno androwno<2

    --第九题

    --查询所有学生都选修的课程编号和课程名称(选作)

    --有歧义,一种意思是该课程所有学生都选了,另一种意思所有学生都选过的课,至少每门课都被选了一次。

    select c.cno,c.cname from c wherec.cno  in (select sc.cno from sc group bysc.cno having count(*)>=1)--另一种意思所有学生都选过的课,至少每门课都被选了一次。

    select c.cno,c.cname from c where c.cnoin(select cno from sc group by sc.cno having count(*)=(select count(*) from s))

    --第十题

    -- 查询学完所有课程的学生学号和姓名(选作)

    select s.sno,s.sname from s where s.sno in(select sc.sno from sc group by sc.sno having count(*) = (select count(*) fromc))

    展开全文
  • 数据库 API(在此例中为 Oracle API)就是一个例子。使用 Computronix 的 cx_Oracle Python 模块,您可以在维持与 Python 数据库 API 规范 v2.0 的兼容性的同时,控制 Oracle查询模型。 对于所有遵循该规范的...

    在 Python 做事方式的核心原则中,有一个规定是要求具有到 API 的高级接口。数据库 API(在此例中为 Oracle API)就是一个例子。使用 Computronix 的 cx_Oracle Python 模块,您可以在维持与 Python 数据库 API 规范 v2.0 的兼容性的同时,控制 Oracle 的查询模型。

    对于所有遵循该规范的客户端库而言,使用 DB API 2.0 查询数据库的模型都是一致的。在此基础上,cx_Oracle 的主要开发人员 Anthony Tuininga 添加了一组丰富的属性和方法,以向开发人员揭示 Oracle 独有的特性。仅用标准的方法而忘掉“额外的”方法是绝对可能的,但在本文中您不会这么做。通用数据库包装这一概念可能在某些情况下起作用,但与此同时,您会失去 RDBMS 提供的所有优化。

    DB API 2.0 和 cx_Oracle 介绍


    Python 数据库 API 规范 v2.0 是集体努力的成果,用于统一不同数据库系统的访问模型。拥有一组相对较少的方法和属性,在更换数据库供应商时就易于学习并保持一致。它不以任何方式将数据库对象映射到 Python 结构中。用户仍然需要手工编写 SQL。在更换到另一数据库后,此 SQL 可能需要重新编写。尽管如此,它还是出色妥善地解决了 Python 数据库的连接性问题。

    该规范定义了 API 的各个部分,如模块接口、连接对象、游标对象、类型对象和构造器、DB API 的可选扩展以及可选的错误处理机制。

    数据库和 Python 语言之间的网关是连接对象。它包含制作数据库驱动的应用程序所需的全部组件,不仅符合 DB API 2.0,而且是规范方法和属性的一个超集。在多线程的程序中,模块和连接可以在不同线程间共享,但是不支持游标共享。这一限制通常是可接受的,因为共享游标可能带来死锁风险。

    Python 大量使用了异常模型,DB API 定义了若干标准异常,它们在调试应用程序中的问题时会非常有用。下面是一些标准异常,同时提供了原因类型的简要说明:

    • Warning — 数据在执行插入操作时被截断,等等
    • Error — 这里提到的除 Warning 外的所有异常的基类。
    • InterfaceError — 数据库接口而非数据库本身故障(本例为 cx_Oracle 问题)
    • DatabaseError — 严格意义上的数据库问题
    • DataError — 包含如下结果数据的问题除数为 0,值超出范围等
    • OperationalError — 与编程人员无关的数据库错误:连接丢失、内存分配错误、事务处理错误等
    • IntegrityError — 数据库的关系完整性受到了影响,例如,外键约束失败
    • InternalError — 数据库遇到内部错误,例如,游标无效、事务不同步
    • ProgrammingError — 未找到表、SQL 语句中的语法错误、指定参数的数量错误等
    • NotSupportedError — 调用的 API 部件并不存在

    连接过程首先从连接对象开始,这是创建游标对象的基础。除游标操作外,连接对象还使用 commit() 和 rollback() 方法对事务进行管理。执行 SQL 查询、发出 DML/DCL 语句和获取结果这些过程均受游标控制。

    在游标和连接类的实现中,cx_Oracle 对标准的 DB API 2.0 规范进行了最大程度的扩展。如果需要,所有这些扩展都将在文本中清楚地标记。

    入门

    在使用查询和游标之前,首先需要建立数据库连接。提供凭证和数据源名称的方法有多种,其结果都是相似的。在从下面的 Python 交互式会话提取的内容中,连接对象 db、db1 和 db2 都是等同的。makedsn() 函数根据给定的参数值创建一个 TNS 条目。此处将它赋值给变量 dsn_tns。如果环境设置得当,您可以使用更短的形式 cx_Oracle.connect('hr/hrpwd'),从而省略用于 db 和 db1 的简单连接字符串。

     

    >>> import cx_Oracle
    >>> db = cx_Oracle.connect('hr', 'hrpwd', 'localhost:1521/XE')
    >>> db1 = cx_Oracle.connect('hr/hrpwd@localhost:1521/XE')
    >>> dsn_tns = cx_Oracle.makedsn('localhost', 1521, 'XE')
    >>> print dsn_tns
    (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SID=XE)))
    >>> db2 = cx_Oracle.connect('hr', 'hrpwd', dsn_tns)

     

     

    在连接对象的作用域内(如分配给上面的 db 变量的连接对象),您可以通过查询版本属性获得数据库版本(这是 DB API 2.0 的一个扩展)。这可以用于使 Python 程序依赖于具体版本的 Oracle 产品。同样地,您可以通过查询 dsn 属性获得连接的连接字符串。

    >>> print db.version
    10.2.0.1.0
    >>> versioning = db.version.split('.')
    >>> print versioning
    ['10', '2', '0', '1', '0']
    >>> if versioning[0]=='10':
    ... print "Running 10g"
    ... elif versioning[0]=='9':
    ... print "Running 9i"
    ...
    Running 10g
    >>> print db.dsn
    localhost:1521/XE
     

    游标对象

    您可以使用连接对象的 cursor() 方法定义任意数量的游标。简单的程序使用一个游标就可以了,该游标可以一再地重复使用。但较大的项目可能要求几个不同的游标。

    >>> cursor = db.cursor()


    应用程序逻辑通常需要明确区分针对数据库发出的语句的各个处理阶段。这有助于更好地理解性能瓶颈并编写更快且经过优化的代码。语句处理分三个阶段: 

    1. 分析(可选)
      • cx_Oracle.Cursor.parse([statement]) 
        实际上并不需要调用,因为在执行阶段会自动分析 SQL 语句。该方法可以用于在执行语句前对其进行验证。当这类语句中检测出错误时,会引发 DatabaseError 异常,相应的错误消息通常可能是“ORA-00900:invalid SQL statement, ORA-01031:insufficient privileges or ORA-00921:unexpected end of SQL command.”
    2. 执行
      • cx_Oracle.Cursor.execute(statement, [parameters], **keyword_parameters)
        此方法可以接受单个参数 — 一条 SQL 语句 — 直接针对数据库来运行。通过 parameters 或 keyword_parameters 参数赋值的绑定变量可以指定为字典、序列或一组关键字参数。如果已经提供了字典或关键字参数,那么这些值将与名称绑定。如果给出的是序列,将根据这些值的位置对它们进行解析。如果是查询操作,此方法返回一个变量对象列表;如果不是,则返回 None。
      • cx_Oracle.Cursor.executemany(statement, parameters)
        对于批量插入尤其有用,因为它可以将所需的 Oracle 执行操作的数量限制为仅一个。有关如何使用该方法的详细信息,请参见下面的“一次多行”部分。
         
    3. 获取(可选)— 仅用于查询(因为 DDL 和 DCL 语句不返回结果)。在不执行查询的游标上,这些方法将引发 InterfaceError 异常。
      • cx_Oracle.Cursor.fetchall() 
        以字节组列表形式获取结果集中的所有剩余行。如果没有剩余的行,它返回一个空白列表。获取操作可以通过设置游标的 arraysize 属性进行调整,该属性可设置在每个底层请求中从数据库中返回的行数。arraysize 的设置越高,需要在网络中往返传输的次数越少。arraysize 的默认值为 1。
      • cx_Oracle.Cursor.fetchmany([rows_no]) 
        获取数据库中接下来的 rows_no 行。如果该参数未指定,该方法获取的行数是 arraysize 的数量。如果 rows_no 大于获取到的行的数目,该方法获取的行数是剩余的行数。
      • cx_Oracle.Cursor.fetchone() 
        从数据库中获取单个字节组,如果没有剩余行,则返回 none。

    在继续了解游标示例前,请先了解 pprint 模块的 pprint 函数。它用于以清晰、可读的形式输出 Python 数据结构。

    >>> from pprint import pprint
    >>> cursor.execute('SELECT feed_id, feed_url, XMLType.GetClobVal(feed_xml) FROM rss_feeds')
    >>> cursor.execute('SELECT * FROM jobs')
    [<cx_Oracle.STRING with value None>, <cx_Oracle.STRING with value None>, <cx_Oracle.NUMBER with value None>, <cx_Oracle.NUMBER with value None>]
    >>> pprint(cursor.fetchall())
    [('AD_PRES', 'President', 20000, 40000),
    ('AD_VP', 'Administration Vice President', 15000, 30000),
    ('AD_ASST', 'Administration Assistant', 3000, 6000),
    ('FI_MGR', 'Finance Manager', 8200, 16000),
    ('FI_ACCOUNT', 'Accountant', 4200, 9000),
    ?
    ('PR_REP', 'Public Relations Representative', 4500, 10500)]
    <cx_oracle.string none="" value="" with=""><cx_oracle.string none="" value="" with=""><cx_oracle.number none="" value="" with=""><cx_oracle.number none="" value="" with="">

    cx_Oracle 游标是迭代器。利用这些强大的 Python 结构,您可以一种自然的方式对序列进行迭代,该方式仅根据需要获取后续的项。高成本的数据库选择操作自然符合这一思路,因为数据只在需要时才被获取。您可以进行迭代操作直至找到需要的值或满足另一条件,而不必创建或获取整个的结果集。

    >>> cursor = db.cursor()
    >>> cursor.execute('SELECT * FROM jobs')
    [<cx_Oracle.STRING with value None>, <cx_Oracle.STRING with value None>, <cx_Oracle.NUMBER with value None>, <cx_Oracle.NUMBER with value None>]
    >>> for row in cursor: ## notice that this is plain English!
    ... print row
    ...
    ('AD_VP', 'Administration Vice President', 15000, 30000)
    ('AD_ASST', 'Administration Assistant', 3000, 6000)
    ('FI_MGR', 'Finance Manager', 8200, 16000)
    ('FI_ACCOUNT', 'Accountant', 4200, 9000)
    ('AC_MGR', 'Accounting Manager', 8200, 16000)
    ?
    ('PR_REP', 'Public Relations Representative', 4500, 10500)
    <cx_oracle.string none="" value="" with=""><cx_oracle.string none="" value="" with=""><cx_oracle.number none="" value="" with=""><cx_oracle.number none="" value="" with="">

    执行 list(cursor) 后,会针对 cursor.fetchall() 执行相同的任务。这是因为内置的 list() 函数会在给定的迭代器结束前一直进行迭代。


    数据类型

    在获取阶段,基本的 Oracle 数据类型会映射到它们在 Python 中的等同数据类型中。cx_Oracle 维护一个单独的、有助于这一转换的数据类型集合。Oracle - cx_Oracle - Python 映射为:

    Oracle cx_Oracle Python
    VARCHAR2
    NVARCHAR2
    LONG

    cx_Oracle.STRING

    str

    CHAR

    cx_Oracle.FIXED_CHAR

    NUMBER

    cx_Oracle.NUMBER

    int

    FLOAT

    float

    DATE

    cx_Oracle.DATETIME

    datetime.datetime

    TIMESTAMP

    cx_Oracle.TIMESTAMP

    CLOB

    cx_Oracle.CLOB

    cx_Oracle.LOB

    BLOB

    cx_Oracle.BLOB

     

    除涉及大型对象的情况外,上述数据类型对于用户通常是透明的。截至版本 4.3,cx_Oracle 仍然自已处理这些数据类型,而没有与内置的文件类型打包到一起。

    cx_Oracle 目前不负责处理的其他数据类型包括 XMLTYPE 和所有复杂的类型。目前所有对未支持类型的列的查询都会失败,同时引发 NotSupportedError 异常。您需要从查询中清除它们或将它们转换为支持的数据类型。

    例如,考虑下面用于存储聚合的 RSS 信源提供的表:

    CREATE TABLE rss_feeds (
    feed_id NUMBER PRIMARY KEY,
    feed_url VARCHAR2(250) NOT NULL,
    feed_xml XMLTYPE
    );


    尝试使用 Python 查询此表时,需执行一些额外的步骤。在下例中,XMLType.GetClobVal() 用于以 CLOB 值形式从表中返回 XML。

    >>> cursor.execute('SELECT * FROM rss_feeds')

    Traceback (most recent call last):
    File "<pyshell#37>", line 1, in <module>
    cursor.execute('SELECT * FROM rss_feeds')
    NotSupportedError: Variable_TypeByOracleDataType: unhandled data type 108
    >>> cursor.execute('SELECT feed_id, feed_url, XMLType.GetClobVal(feed_xml) FROM rss_feeds')
    [<cx_Oracle.NUMBER with value None>, <cx_Oracle.STRING with value None>, <cx_Oracle.CLOB with value None>]

     

    您可能已经注意到了,cx_Oracle.Cursor.execute* 系列方法为查询返回列数据类型。这些是变量对象列表(DB API 2.0 的扩展),它们在获取阶段之前获取值 None,在获取阶段之后获取合适的数据值。有关数据类型的详细信息,可以通过游标对象的 description 属性获得。description 是一个包含 7 项内容的字节组,每个字节组包含列名、列类型、显示大小、内部大小、精度、小数位数以及是否存在空的可能。注意列信息仅可供 SQL 查询语句访问。

    >>> column_data_types = cursor.execute('SELECT * FROM employees')
    >>> print column_data_types
    [<cx_Oracle.NUMBER with value None>, <cx_Oracle.STRING with value None>, <cx_Oracle.STRING with value None>, <cx_Oracle.STRING with value None>, <cx_Oracle.STRING with value None>, <cx_Oracle.DATETIME with value None>, <cx_Oracle.STRING with value None>, <cx_Oracle.NUMBER with value None>, <cx_Oracle.NUMBER with value None>, <cx_Oracle.NUMBER with value None>, <cx_Oracle.NUMBER with value None>]
    >>> pprint(cursor.description)
    [('EMPLOYEE_ID', <type 'cx_Oracle.NUMBER'>, 7, 22, 6, 0, 0),
    ('FIRST_NAME', <type 'cx_Oracle.STRING'>, 20, 20, 0, 0, 1),
    ('LAST_NAME', <type 'cx_Oracle.STRING'>, 25, 25, 0, 0, 0),
    ('EMAIL', <type 'cx_Oracle.STRING'>, 25, 25, 0, 0, 0),
    ('PHONE_NUMBER', <type 'cx_Oracle.STRING'>, 20, 20, 0, 0, 1),
    ('HIRE_DATE', <type 'datetime.datetime'>, 23, 7, 0, 0, 0),
    ('JOB_ID', <type 'cx_Oracle.STRING'>, 10, 10, 0, 0, 0),
    ('SALARY', <type 'cx_Oracle.NUMBER'>, 12, 22, 8, 2, 1),
    ('COMMISSION_PCT', <type 'cx_Oracle.NUMBER'>, 6, 22, 2, 2, 1),
    ('MANAGER_ID', <type 'cx_Oracle.NUMBER'>, 7, 22, 6, 0, 1),
    ('DEPARTMENT_ID', <type 'cx_Oracle.NUMBER'>, 5, 22, 4, 0, 1)]
    <cx_oracle.number none="" value="" with=""><cx_oracle.string none="" value="" with=""><cx_oracle.string none="" value="" with=""><cx_oracle.string none="" value="" with=""><cx_oracle.string none="" value="" with=""><cx_oracle.datetime none="" value="" with=""><cx_oracle.string none="" value="" with=""><cx_oracle.number none="" value="" with=""><cx_oracle.number none="" value="" with=""><cx_oracle.number none="" value="" with=""><cx_oracle.number none="" value="" with="">

    绑定变量模式


    正如 Oracle 大师 Tom Kyte 介绍的那样,绑定变量是数据库开发的核心原则。它们不仅使程序运行更快,同时可以防范 SQL 注入攻击。请看以下查询:

    SELECT * FROM emp_details_view WHERE department_id=50 
    SELECT * FROM emp_details_view WHERE department_id=60 
    SELECT * FROM emp_details_view WHERE department_id=90 
    SELECT * FROM emp_details_view WHERE department_id=110 

    逐个运行时,它们需要分别进行分析,这为您的应用程序增加了额外的开销。通过使用绑定变量,您可以告诉 Oracle 对一个查询只分析一次。cx_Oracle 支持按名称或位置绑定变量。

    按名称传递绑定变量要求执行方法的 parameters 参数是一个字典或一组关键字参数。下面的 query1 和 query2 是等同的:


    >>> named_params = {'dept_id':50, 'sal':1000}
    >>> query1 = cursor.execute('SELECT * FROM employees WHERE department_id=:dept_id AND salary>:sal', named_params)
    >>> query2 = cursor.execute('SELECT * FROM employees WHERE department_id=:dept_id AND salary>:sal', dept_id=50, sal=1000)

    在使用已命名的绑定变量时,您可以使用游标的 bindnames() 方法检查目前已指定的绑定变量:


    >>> print cursor.bindnames() 
    ['DEPT_ID', 'SAL']

    按位置传递与此相似,但是您需要谨慎命名。变量名是任意的,因此这种方式很容易使查询混乱。在下例中,三个查询 r1、r2 和 r3 都是等同的。parameters 变量必须作为序列提供。


    >>> r1 = cursor.execute('SELECT * FROM locations WHERE country_id=:1 AND city=:2', ('US', 'Seattle'))
    >>> r2 = cursor.execute('SELECT * FROM locations WHERE country_id=:9 AND city=:4', ('US', 'Seattle'))
    >>> r3 = cursor.execute('SELECT * FROM locations WHERE country_id=:m AND city=:0', ('US', 'Seattle'))

    在绑定时,您可以首先准备该语句,然后利用改变的参数执行 None。根据绑定变量时准备一个语句即足够这一原则,Oracle 将如同在上例中一样对其进行处理。准备好的语句可执行任意次。


    >>> cursor.prepare('SELECT * FROM jobs WHERE min_salary>:min')
    >>> r = cursor.execute(None, {'min':1000})
    >>> print len(cursor.fetchall())
    19


    您已经限制了分析次数。在下一段中,我们将消除不必要的执行,尤其是成本高昂的批量插入。

    一次多行


    大型的插入操作不需求多次的单独插入,这是因为 Python 通过 cx_Oracle.Cursor.executemany 方法完全支持一次插入多行。限制执行操作的数量极大地改善了程序性能,因此在编写存在大量插入操作的应用程序时应首先考虑这一功能。 

    我们首先为 Python 模块列表创建一个表,这次直接从 Python 开始。您将在以后删除该表。

    >>> create_table = """
    CREATE TABLE python_modules (
    module_name VARCHAR2(50) NOT NULL,
    file_path VARCHAR2(300) NOT NULL
    )
    """
    >>> from sys import modules
    >>> cursor.execute(create_table)
    >>> M = []
    >>> for m_name, m_info in modules.items():
    ... try:
    ... M.append((m_name, m_info.__file__))
    ... except AttributeError:
    ... pass
    ...
    >>> len(M)
    76
    >>> cursor.prepare("INSERT INTO python_modules(module_name, file_path) VALUES (:1, :2)")
    >>> cursor.executemany(None, M)
    >>> db.commit()
    >>> r = cursor.execute("SELECT COUNT(*) FROM python_modules")
    >>> print cursor.fetchone()
    (76,)
    >>> cursor.execute("DROP TABLE python_modules PURGE")

    仅向数据库发出一个执行操作,要求将 76 个模块名称全部插入。这对大型插入操作而言是一个巨大的性能提升。注意此处的两点小的不同:cursor.execute(create_tab) 不产生任何输出,这是因为它是一个 DDL 语句,而 (76,) 是一个有单个元素的字节组。不含逗号的 (76) 完全等同于整数 76。

    总结

    熟悉 Oracle-Python 连接性的基本概念之后,您就可以开始编写自己的数据库驱动的应用程序了。我强烈建议花一些时间来使用 Python 交互式 shell,因为它确实会使学习过程更加容易。

    您了解了 SQL 语句经历的三个阶段,也了解了如何将 Oracle 数据库需要执行的步骤减至最少。绑定变量是数据库应用程序开发不可避免的一部分,Python 支持按名称或位置进行绑定。

    您还了解了 Oracle 和 Python 数据类型间的平滑转换,以及在将游标作为迭代器进行处理的上下文中数据库数据的自然处理方式。所有这些特性都促进了生产效率的提高并支持专注于数据,而这正是核心所在。

    展开全文
  • 结合order by和rownum来做: --第一条 select * from bdatag_tag order by tag_id where rownum = 1; --最后一条 select * from bdatag_tag order by tag_id desc where rownum = 1;
  • 关于处理小数点位数的几个oracle函数() 1. 取四舍五入的几位小数 select round(1.2345, 3) from dual; 结果:1.235 2. 保留两位小数 select trunc(1.2345, 2) from dual; 结果:1.23select trunc(1.2399, 2) from dual...
  • 关于处理小数点位数的几个oracle函数() 1. 取四舍五入的几位小数 select round(1.2345, 3) from dual; 结果:1.235 2. 保留两位小数,只舍 select trunc(1.2345, 2) from dual; 结果:1.23 select trunc(1.2399, 2) ...
  • 今天突然客户提出一需求,要查一下APP所有客户的最近一次登录记录,因为数据库使用的是oracle有点懵逼,首先分析了一下需求,按用户id分组,按登录时间降序,然后取每分组的第一条记录就可以搞定了。经过一顿...
  • Oracle】SQL查询 基本查询语句

    千次阅读 2019-05-22 16:04:24
    Oracle和SQLPlus 每次启动只需启动两...2.OracleService***:数据库的实例服务,他的命名标准:OracleServiceSID,每当为系统增加一个数据库的时候都会自动的出现一个类似的服务名称。 在默认情况下,SID的名称...
  • oracle层次化查询

    2014-03-27 10:01:37
    查了一下,层次化查询有时也称connect by 查询,是oracle特有的特性,这类查询可以选取数据,并使用层次化的次序返回结果。 connect by 和start with 子句语法如下: SELECT [LEVEL],COLUMN, expression,... FROM...
  • 最近有业务需求(springboot项目集合mybatis):需要查询分组后,取每组的第一条数据(oracle数据库),可以在业务代码中实现,但是过于繁琐,后来查阅oracle的函数,得出仅仅在sql中即可实现,非常简洁,简化...
  • oracle 层次查询

    千次阅读 2012-09-19 10:39:20
    1 定义:  层次查询使用树的遍历,走遍含树形结构的数据集合,来获取树的层次关系报表的方法  树形结构的父子关系,你可以控制: ... 层次查询语句正是从这两方面来确定的,start with确定开始点,c
  • 原址如下: ... 精通 Oracle+Python, 1 部分:查询最佳应践 作者:Przemyslaw Piotrowski 首先,熟悉 Oracle-Python 连接性的基本概念 20
  • Oracle 查询高级用法

    千次阅读 2013-12-10 17:57:06
    Oracle SQL 一些函数用法 以下sql环境都是在 oracle 11g/scott 完成 Group by 与GROUP BY 一起使用的关建字 GROUPING,GROUP SET,ROLLUP,CUBE结合这些特性的函数可以实现SQL的明细+分组统计 GROUPING GROUPING 记录是...
  • 1、先查看emp表中的数据2、要求查询前10行数据出来--通过Oracle的伪列rownum更直观一点,把伪列也放上去查询,其中a为表emp的别名--排序后再查询排序后的前10列3、分页查询--每页5条,查询第二页,即查询序号5到10的...
  • Oracle中,可以使用 Instr 函数对某个字符串进行判断,判断其是否含有指定的字符。 其语法为: ...position:代表查找的开始位置,该参数可的,默认为 1;默认查找顺序为从左到右。当起始位置为负
  • 数据库表如下,出来的这行有几属性值为NULL,其中4列 的QI oracle类型为number 实体类部分如下,其中 qi对应数据库表中的QI列,类型为double 使用sql语句在navicat中能正确查出数据,可是在hibernate中,查出...
  • Oracle排序取第一

    千次阅读 2017-08-09 16:03:08
    select * from (select * from <table> order by <key> desc) where rownum=1;
  • Oracle

    千次阅读 2018-04-15 22:05:57
    也是第一个提出sql命令的数据库。Oracle提供了数据的解决方案。 解决十万百万级数据而Windows 系统无法处理庞大的数据在企业中 一般把oracle服务器装在linux,unix;【装window上 一辆跑车开在田野上】如何安装1. ...
  • Oracle 模糊查询优化

    千次阅读 2013-08-06 19:20:20
    模糊查询是数据库查询中经常用到的,一般常用的格式如下: (1)字段 like '%关键字%'  字段包含"关键字“的记录 即使在目标字段建立索引也不会走索引,速度最慢  (2)字段 like '关键字%' 字段以"关键字...
  • oracle取出每分组的第一条记录

    千次阅读 2017-07-20 20:23:17
    取出每分组的第一条记录sql
  • 关于处理小数点位数的几个oracle函数() 1. 取四舍五入的几位小数 select round(1.2345, 3) from dual; 结果:1.235 2. 保留两位小数,只舍 select trunc(1.2345, 2) from dual; 结果:1.23 select trunc(1....
  • oracle查询重复数据方法

    万次阅读 2014-01-16 10:22:23
    SQL重复记录查询方法 2008年08月14日 星期四 21:01 SQL重复记录查询 1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select ...
  • 关于Oracle查询优化的相关字符串操作以及常用的字符串函数~
  • Oracle 10.2 概念 第一Oracle介绍

    千次阅读 2009-02-26 16:20:00
    Oracle 概念(Oracle 10.2)1Oracle介绍本章提供了针对Oracle数据库服务器的概述,包含以下主题l Oracle数据库体系结构l Oracle数据库特点l Oracle数据库应用开发Oracle数据库体系结构Oracle数据库是将数据...
  • Oracle sql查询语法详解

    千次阅读 2018-10-12 09:36:12
    Oracle sql查询语法详解   查询数据 select 语法: SELECT column_1, column_2, ... FROM table_name; select要求 首先,指定要从中查询数据的表名(必须有from子句)。 其次,指示要...
  • oracle

    千次阅读 2013-11-25 16:18:05
    1、Schemas oracle ebs 系统下的schema可以被分为如下几类: 1、所有数据库(不论是否是ebs 数据库)都有的schema:如SYS,SYSTEM 2、oracle ebs组件特有的schema:如...4、三方或者数据库可特性的schema:如CTXS

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,350
精华内容 36,940
关键字:

oracle查询结果选第一个