php操作Oralce
admin
2023-06-15 15:42:38
0次

Oralce与Mysql在操作上有很大区别,比如:

  1. Oralce字段使用关键字时需要加引号写到SQL中,如:user,order,size等。

  2. Oralce没有limit而需要用numrow记录序号,如提取第三条后四数据:numrow>=3 and numrow<8

  3. 数据类型

  4. Oralce没有auto_imcrement自增主键而需要使用序列等方式替代(SEQUENCE)

  5. 取最后插入主键,Oralce需要特殊处理,如查序列currval值

  6. Oralce写超过4000字节数据需要特殊处理。



在这里说明自增主键和超过4000字节长数据。


使用序列自增

那么每个表都需要创建一个独立的序列,创建语句是:

CREATE SEQUENCE sequence  //创建序列名称
       [INCREMENT BY n]  //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
       [START WITH n]    //开始的值,递增默认是minvalue 递减是maxvalue
       [{MAXVALUE n | NOMAXVALUE}] //最大值
       [{MINVALUE n | NOMINVALUE}] //最小值
       [{CYCLE | NOCYCLE}] //循环/不循环
       [{CACHE n | NOCACHE}];//分配并存入到内存中


如:

CREATE SEQUENCE sq_name
    INCREMENT BY 1  -- 每次加几个  
    START WITH 1    -- 从1开始计数  
    NOMAXVALUE      -- 不设置最大值  
    NOCYCLE         -- 一直累加,不循环  
    CACHE 10;


每个序列包含:

  NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用,插入时当主键值使用
  CURRVAL 中存放序列的当前值,取最后插入主键ID时使用


插入数据时使用: sq_name.nextval  作为主键值(注意不能加引号)

如:

insert into table_name(id,name)value(sq_name.nextval,"OK");

取出最近插入主键则需要使用SQL查询:

SELECT sq_name.currval currval FROM dual


插入超长内容

oralce官方文档说明:http://www.oracle.com/technetwork/articles/fuecks-lobs-095315.html


使用oci函数处理:

//说明 empty_clob() 是创建一个空的clob如果是blob则使用empty_blob。
//需要增加 RETURNING语句来绑定空clob并指定占位符。
//插入与修改类似
$sql = "UPDATE
           mylobs
        SET
            mylob = EMPTY_CLOB()
        WHERE
           id = 2403
        RETURNING
            mylob INTO :mylob";

$stmt = oci_parse($conn, $sql);
//创建新的空 LOB 或 FILE 描述符,生成一个OCI-Lob对象,注意使用这个写文本实际是SQL先执行后回填内容,所以不能自动提交
$mylob = oci_new_descriptor($conn,OCI_D_LOB);

//绑定占位符数据,注意最后一个参数一定要与字段数据类型一样。
oci_bind_by_name($stmt,':mylob',$mylob, -1, OCI_B_CLOB);

//执行预处理SQL,注意不能自动提交需要一定要增加第二个参数,否则长文本无法写入。
oci_execute($stmt, OCI_DEFAULT) or die ("Unable to execute query\n");

//给OCI-Lob对象保存长文本内容,注意这里传入的参数将全部写入点位符中。
if ( !$mylob->save( 'UPDATE: '.date('H:i:s',time()) ) ) {

    //保存失败回滚
    oci_rollback($conn);
    
    die("Unable to update lob\n");
    
}
//保存成功提交
oci_commit();

说明:如果使用oci函数在使用点位符时需要严格按数据类型走,否则会出错,所以使用oci_bind_by_name的方式时需要格外注意每个字段的数据类型是否匹配。


使用PDO处理:

//链接数据库
$pod=new PDO('oci:dbname=test;charset=utf8','system','admin123456');

//预处理SQL
$sth=$pod->prepare("INSERT INTO mylobs (id, mylob) VALUES (tslbh_xk.nextval, ?)");

//要写入的clob越长内容
$val='INSERT:test contents';

//绑定参数,注意当是lob类型时需要指定数据长度,否则会报错类型不对
$sth->bindParam(1, $val, PDO::PARAM_STR,strlen($val));

//执行SQL
$sth->execute() or die ("Unable to execute query\n");

说明:使用PDO的占位符也是需要指定数据类型,默认是PDO::PARAM_STR,包含execute函数。


最后因能力有限如果文本有错还请指出!

上一篇:PHP的多态

下一篇:让sublime编译php、js

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...