zoukankan      html  css  js  c++  java
  • Sqlserver2005:深入了解php执行sqlserver存储过程procedure:odbc_exe、odbc_execute

    以下存储过程(伪代码):

    -- 伪代码,假设相关操作是成功的
    alter procedure pr_test
    as
    begin
        set nocount on
    
        update tab set col='newvalue' --update操作
    
        select * from tab  --select查询,返回结果集
    
        exec pr_test_2 --exec执行存储过程,一系列的操作,可能返回结果集
    
        insert into tab  --insert操作
        select * 
        from temp
    
        select * from temp --select查询2,返回结果集
    
        delete * from temp --delete操作
    
    end
    go

    站在sqlserver客户端的角度 (sql引擎外面),究竟是如何执行的呢?

    个人的研究心得:

    1. sql引擎仍是机械的一步一步执行,运行存储过程和直接运行sql语句的不同在于执行的上下文环境(变量、自动执行下一步指令)有所不同。所以,客户端必须是(1)等待每一步的执行,如果不需要客户端介入处理结果集;(2)处理结果集:展示or丢弃;(3)下达存储过程执行的中断命令:杀死会话or主动反应(处理结果集or丢弃结果集)
    2. 存储过程作为一个完整的代码单元,起最终会有一个执行的状态(return状态):(1)正常的或默认的return 0;(2)手工的return n;(3)执行异常终止,sql引擎抛出的错误代码
    3. 存储过程内的顺序很重要,因为每一步都要按处理流程执行和等待反馈。特别的select返回结果集,不同的客户端或编程接口行为会不同:sqlserver自己的查询分析器或企业管理器仅仅是客户端的一种,它的表现行为不代表其他客户端或编程接口也是同样

    存储过程返回多个结果集的问题:

    sqlserver自身的查询分析器很好的表现!!

    php对多个结果集进行处理:默认取得第一个结果集的句柄,其他的必须通过 odbc_next_result($resultset) 来遍历,而且必须要遍历!否则会出现错误严重的错误 “[Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt

    如果仅仅关心默认的第一个结果集,可以在程序后面加入来释放占用的连接资源

    while(odbc_next_result($rows)){;}
  • 相关阅读:
    kubernetes部署Ingress Controller创建证书
    污点和容忍度
    Kubernetes部署coredns
    python中私有属性和私有方法
    类的约束
    reactjs 入门
    angularjs ngTable -Custom filter template-calendar
    sql 中条件in参数问题
    详解 nginx location ~ .*.(js|css)?$ 什么意思?
    CentOS 7.2.1511编译安装Nginx1.10.1+MySQL5.7.14+PHP7.0.11
  • 原文地址:https://www.cnblogs.com/jinzhenshui/p/3200022.html
Copyright © 2011-2022 走看看