SQL游标在不知道表描述的情况下获取数据
我正在编写一个Pro*C函数,它将接受表名并返回存储在其中的值SQL游标在不知道表描述的情况下获取数据,sql,cursor,Sql,Cursor,我正在编写一个Pro*C函数,它将接受表名并返回存储在其中的值 select * from <table_name> 在上面的代码中,我们需要表描述,这样我们就可以使用如下语句 emp_rec.first_name emp_rec.last_name 假设我们不知道表的描述,那么如何从游标中获取值 有可能吗?为了实现上述目标,我为Pro*C开发了一个API,它有几个函数和内置类,使使用Pro*C进行DB交互非常容易。看 示例代码: int main() { SQL
select * from <table_name>
在上面的代码中,我们需要表描述,这样我们就可以使用如下语句
emp_rec.first_name
emp_rec.last_name
假设我们不知道表的描述,那么如何从游标中获取值
有可能吗?为了实现上述目标,我为Pro*C开发了一个API,它有几个函数和内置类,使使用Pro*C进行DB交互非常容易。看 示例代码:
int main()
{
SQLHelper DB("username","password");
vector< vector<string> > rowData;
try
{
DB.openDB(); //connect to oracle database
if(DB.checkDBStatus()) //if connected to database or not
{
cout<<"connected"<<endl;
}
rowData=DB.selectDB("select to_char(sysdate) from dual"); //fetch all rows in rowData
if(rowData.size()>0) //to check if rows are fetched or not
{
for(int i=0;i<rowData.size();i++) //access each row
{
for(int j=0;j<rowData.at(i).size();j++) //access each column
{
cout<<rowData.at(i).at(j);
}
cout<<endl;
}
}
else
{
cout<<"No rows fetched"<<endl;
}
}
catch(SQLHelperException sqlExp) //catch any exception during SQL execution
{
cout<<sqlExp.getExceptionString()<<endl;
}
return 0;
}
这就是我们如何在不知道表的描述的情况下检索任何表。您能更好地解释一下您想要的是什么吗?。在不知道表描述的情况下从任意表中选择,看起来您想要一个SELECT*,但我猜这不是您想要的want@Lamak:请查看编辑。动态SQL可以处理它。这是对sys表的选择,以获取列名,将它们加载到游标中,并在其中循环以生成SQL。是的,这是一个用来构建游标的游标。动态SQL带来了一些安全问题,老实说,我的第一反应是找到一个基于集合的解决方案,不要使用游标。@12th:先生,请您详细说明一下。。。我不明白。嗯……你改变了你的问题,所以我的答案不再有意义。您可以从syscolumns中选择列名,从syscolumns中选择名称,在sysobjects中选择id,其中名称='table1',并使用这些结果在变量中构建sql语句。这很痛苦,很难排除故障。我讨厌这么说……如果SQL是一辆高性能的汽车,那么使用光标就是下车和推。我想你可以,但你为什么要呢?
int main()
{
SQLHelper DB("username","password");
vector< vector<string> > rowData;
try
{
DB.openDB(); //connect to oracle database
if(DB.checkDBStatus()) //if connected to database or not
{
cout<<"connected"<<endl;
}
rowData=DB.selectDB("select to_char(sysdate) from dual"); //fetch all rows in rowData
if(rowData.size()>0) //to check if rows are fetched or not
{
for(int i=0;i<rowData.size();i++) //access each row
{
for(int j=0;j<rowData.at(i).size();j++) //access each column
{
cout<<rowData.at(i).at(j);
}
cout<<endl;
}
}
else
{
cout<<"No rows fetched"<<endl;
}
}
catch(SQLHelperException sqlExp) //catch any exception during SQL execution
{
cout<<sqlExp.getExceptionString()<<endl;
}
return 0;
}