重温C++

C++
1 子函数可以把定义放在MAIN函数前, 实现在MAIN函数后
2 函数之间的值传和地址传方式

 call()
 {
  vector<string> name;
  string lastname
  who_is(&name,&lastname);
  cout<<name<<endl;
 }
 void who_is(vector<string> *p_firstname,string *p_lastname)
 {
  string l_v_str_firstname("曾");
  string l_v_str_lastname("大侠");
  *p_lastname=l_v_str_firstname;
  p_firstname->push_back(l_v_str_firstname);
 }

调用函数call把本地变量的name地址传给被调用函数who_is

 被调函数声明为指针 string *p_name
 给指针赋值  *p_lastname=l_v_str_firstname;
 给指针赋地址 p_name=&l_v_str_firstname

被调函数who_is 不能把函数内部的变量传到外面去,因为函数调用完后就被清除了。
这样函数内部要把工作结果返回出去,一方面可以通过RETRUN 可惜只能返回1个。
要多个必须主调函数把外面的变量地址传进来,然后给这个地址空间赋值,真实的值。

上面指针比较容易让人混淆,主要是跟普通变量相比。
很容易给指针赋值写成了 p_name=l_v_str_firstname。这实际上把指针里面的地值替换成新的内存地址。
对指针是4个字节32位的存储空间,里面只存放内存地址。
另外个混淆的地方就是指针定义和指针使用 string *p 定义指针 *p= 取指针里面的值。

另还有个引用传值

  call()
 {
  vector<string> name;
  string lastname
  who_is(name,lastname);
  cout<<name<<endl;
 }
 void who_is(vector<string> &p_firstname,string &p_lastname)
 {
  string l_v_str_firstname("曾");
  string l_v_str_lastname("大侠");
  p_lastname=l_v_str_firstname;
  p_firstname.push_back(l_v_str_firstname);
 }

这里主调函数不用&方式把地址传进去,而被调函数通过&方式声明使用主调函数变量的地址
在被调函数内部直接使用该变量,声明形式的变量

  p_lastname=l_v_str_firstname;
  p_firstname.push_back(l_v_str_firstname);

直接赋值不用*来表示,访问成员函数不用-> 而代替的是.
这或许是C++避免让大家混淆吧!
这种方式干净简单不乱,建议使用。如果编辑存C就无法使用。

大家对C或者C++感兴趣,可以在自己的虚拟机上编程一下
linux c/c++ hello word
https://blog.csdn.net/ZengMuAnSha/article/details/5826949
这篇小仙的博客老早以前在LINUX下写的。

Linux下C++连接oracle数据库 OCCI 接口
https://blog.csdn.net/ZengMuAnSha/article/details/51438251
这篇也是在LINUX下使用ORACLE公司免费的IDE NETBEAN8 C++版本
然后再使用ORACLE公司提供的OCCI库,开发个ORACLE数据库的DEMO
最主要的是NETBEAN8可以支持中文版。有IDE支持很多配置易如反掌!
文中的11.2.0.4 SDK下载地址早已失效了

SDK下载地址:
https://download.oracle.com/otn/linux/instantclient/11204/instantclient-sdk-linux.x64-11.2.0.4.0.zip?AuthParam=1575559586_5112f43f5a3f136e263c2afa58b8d757
BAISC:
https://download.oracle.com/otn_software/linux/instantclient/195000/instantclient-basic-linux.x64-19.5.0.0.0dbru.zip
这两个就是OCCI库,都是免费下载的. 不过你只需要注册免费的ORACLE账号就行.

使用IDE在LINUX下编程,自然需要图形界面,LINUX下的XWINDOX系统,还有个GNOME桌面系统. 一般情况下我装系统都会带图形支持,然后INIT3切换到字符界面上. 我使用XMAGNER 的XPASSVIE 什么鬼的工具,可把NETBEAN导到WIN7在操作.

我百度网盘共享一个NETBEAN 不确定是否支持C++,你可以直接上ORACLE官方下.
https://pan.baidu.com/s/16vvlRqjBZkbYCRXKK5IVRg 提取码:l39j
当然你不想整那么多的话,可以直接在虚拟机中的Linux图形界面编程,可以不用XSHELL.
当然NETBEAN 8需要JDK8
我使用ORACLE用户在LINUX下安装这两个家伙的. 另外环境设置下参数

export PATH=$ORACLE_BASE/OPatch:$ORACLE_HOME/bin:$CRS_HOME/bin:$PATH:/sbin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH

PATH最好是把JDK的路径放在最前面.因为虚拟机上的ORACLE也带JAVA.
ORACLE 11G 一般带JAVA7 你在LINUX下java -version 看下是否正确。
LD_LIBRARY_PATH 是库路径,主要调试的时候需要知道它在哪里。
这个主要是OCCI库的BASIC这个包解压的路径。

好了作为ODBA 你除了会PL/SQL,SHELL外 你还会C++ 你可看起来很装逼的语言:
下面是开发个类似ANSIBEL批量执行SQL在30台数据库服务器上

/* 
 * File:   main.cpp
 * Author: oracle
 *
 * Created on 2019年12月4日, 下午4:11
 */

#include <cstdlib>
#include <iostream>
#include <string>
#include <occi.h>
#include <vector>

using namespace std;         //这个是C++标准库
using namespace oracle::occi;//这个是OCCI库 命名空间

/*
 * 先把3个函数的声明放在主函数前
 */
void Conn_Db_Exec(string user,string pwd,string conn,string sql);    
void read_db_conf(vector<string> &p_v_str_user,vector<string> &p_v_str_pwd, vector<string> &p_v_str_conn, string s_classA,string s_classB,string s_classC,string s_dbname);
void read_sql_conf(string &psqltext,string psql_id);


int main(int argc, char** argv) //sqlid,classA,classB,classC,dbname
{
    vector<string> m_v_user; //定义3个字符串数组
    vector<string> m_v_pwd;
    vector<string> m_v_conn;
    string m_s_sql_text;  //定义6个字符串变量
    string m_s_sql_id;
    string m_s_classA;
    string m_s_classB;
    string m_s_classC;
    string m_s_dbname;

    for (int i=0;i<argc; i++)   //显示你输入的参数
    {
        cout<<"Your input Parameter:"<<endl;
        cout<<argv[i]<<endl;
    }    
    if (argc>0)//把输入的参数赋值给变量们
    {
        m_s_sql_id =argv[0];
        m_s_classA=argv[1];
        m_s_classB=argv[2];
        m_s_classC=argv[3];
        if (argc==5)
        {    
          m_s_dbname=argv[4];
        }
        else
        {
            m_s_dbname.clear();
        }    
    read_db_conf(m_v_user,m_v_pwd,m_v_conn,m_s_classA,m_s_classB,m_s_classC,m_s_dbname);   //读入数据库连接信息 
    read_sql_conf(m_s_sql_text,m_s_sql_id);//读需要执行的SQL
    }
    else { cout<<"You not innput parameter"<<endl;}
    if (m_s_sql_text.size() >0 ) //以下是对连接信息和SQL的检验
    {  
      if (m_v_user.size() >0) 
      {
          if(m_v_user.size()==m_v_pwd.size() && m_v_user.size()==m_v_conn.size()) 
          {    
            for (int i=0;i<m_v_user.size();i++) //没毛病的话就循环执行SQL
            {
            cout<<m_v_user[i]<<endl;
            cout<<m_v_pwd[i]<<endl;
            cout<<m_v_conn[i]<<endl;
           // Conn_Db_Exec(m_v_user[i],m_v_pwd[i],m_v_conn[i],m_s_sql_text);  //是针对30台ORACLE数据库的哟!
            }
          } else {cout<<"This Database Number is not as! user.size != pwd.size !=conn.size" <<endl;}
       }else {cout<<"Not Find any database info!"<<endl;}
    }
    else { cout<<"Not Find any SQL TEXT info!"<<endl;}



    //Conn_Db_Exec(main_user,main_pwd,main_conn,main_sql);
   return 0;
}
//以下是读取数据库配置文件,把3个数组的地址传进来装东西的

void read_db_conf(vector<string> &p_v_str_user,vector<string> &p_v_str_pwd,
        vector<string> &p_v_str_conn,       
        string s_classA,string s_classB,string s_classC,string s_dbname)
{
    string str_user("scott");//这先暂时存在变量里,将来打算存在db.conf个文件中
    string str_pwd("123456");
    string str_conn("192.168.2.21:1521/SHARKDB");

      p_v_str_user.push_back(str_user);   //把从文件读到的信息放进数组中 
      p_v_str_pwd.push_back(str_pwd);
      p_v_str_conn.push_back(str_conn);


      str_user="system";
      str_pwd="123456";
      str_conn="192.168.2.21:1521/SHARKDB";

      p_v_str_user.push_back(str_user);     
      p_v_str_pwd.push_back(str_pwd);
      p_v_str_conn.push_back(str_conn);
   /*    
      p_v_str_user->push_back(str_user);     
      p_v_str_pwd->push_back(str_pwd);
      p_v_str_conn->push_back(str_conn);*/
}

//同上根据SQLID从配置文件获得SQL
 void read_sql_conf(string &psqltext,string psql_id)
{
    string l_str_sqltext;
    l_str_sqltext="select sysdate from dual";
    psqltext=l_str_sqltext;

}

//数据库连接执行函数,把上面得到的链接信息和SQL传过来
void Conn_Db_Exec(string user,string pwd,string strconn,string sql)
{
  //以下是OCCI 4个重要指针变量 分别是环境,连接,语句,结果
    Environment *env;
    Connection  *conn;
    Statement   *stmt;
    ResultSet   *rset;     
                         // 定义4个本地变量承接参数,其实也没必要。
    string str_user=user;
    string str_pwd=pwd;
    string str_conn=strconn;
    string str_sql=sql;

    env = Environment::createEnvironment(Environment::OBJECT); //环境初始化
    try
    {
        conn =env->createConnection(str_user,str_pwd,str_conn);//创建连接

        if(conn!=NULL)   
            cout<<"Connect Success"<<endl;
        else
            cout<<"Connect Failed!"<<endl;


        stmt=conn->createStatement(str_sql);  //创建语句
        rset=stmt->executeQuery();            //执行语句,并返回结果
        while(rset->next())                  //结果循环打印行 
        {
            string tr_day=rset->getString(1);   //这里每个字段打印一下
            cout<<"This Database date is :"<<tr_day<<endl;
        }
    }
    catch(SQLException e) //异常处理
    {
        cout<<e.what()<<endl;       //简单地显示异常,并关闭4个重要指针
        stmt->closeResultSet(rset);
        conn->terminateStatement(stmt);
        env->terminateConnection(conn);
        Environment::terminateEnvironment(env);

    }  //最后还是释放4个指针。
        stmt->closeResultSet(rset);
        conn->terminateStatement(stmt);
        env->terminateConnection(conn);
        Environment::terminateEnvironment(env);

}

大家可以在公众号查看本文

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值