{"id":2660,"date":"2017-02-22T09:43:25","date_gmt":"2017-02-22T13:43:25","guid":{"rendered":"http:\/\/linguagemprisma.br4.biz\/blog\/?page_id=2660"},"modified":"2017-12-22T11:46:06","modified_gmt":"2017-12-22T15:46:06","slug":"tutorial-mysql-prisma","status":"publish","type":"page","link":"https:\/\/linguagemprisma.br4.biz\/blog\/tutorial-mysql-prisma\/","title":{"rendered":"Tutorial MySQL &#8211; Prisma"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2661 alignleft\" src=\"https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/02\/mysql.png\" alt=\"mysql\" width=\"232\" height=\"121\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Este ser\u00e1 um how-to (guia) b\u00e1sico para demonstrar o uso do banco de dados servidor MySQL em Prisma.<\/p>\n<h1><\/h1>\n<h1>Pr\u00e9-requisitos:<\/h1>\n<ul>\n<li>Prisma-1.0.99 ou superior.<\/li>\n<li>Servidor Xampp instalado e MySQL configurado.<\/li>\n<\/ul>\n<h3>Links:<\/h3>\n<p style=\"padding-left: 30px;\">Instalando Xampp no Windows:<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/linguagemprisma.br4.biz\/blog\/instalando-xampp-no-windows\/\" target=\"_blank\">https:\/\/linguagemprisma.br4.biz\/blog\/instalando-xampp-no-windows\/<\/a><\/p>\n<p style=\"padding-left: 30px;\">Configurando MySQL no Win.:<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/linguagemprisma.br4.biz\/blog\/configurando-mysql-xampp-em-windows\/\" target=\"_blank\">https:\/\/linguagemprisma.br4.biz\/blog\/configurando-mysql-xampp-em-windows\/<\/a><\/p>\n<p style=\"padding-left: 30px;\">Instalando Xampp no Linux:<\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/linguagemprisma.br4.biz\/blog\/instalando-servidor-xampp\/\" target=\"_blank\"> https:\/\/linguagemprisma.br4.biz\/blog\/instalando-servidor-xampp\/<\/a><\/p>\n<p style=\"padding-left: 30px;\">Configurando Acesso Remoto no Linux: <a href=\"https:\/\/linguagemprisma.br4.biz\/blog\/prisma\/configurando-acesso-remoto-no-mysql-xampp-linux\/\" target=\"_blank\">clique aqui<\/a><\/p>\n<hr \/>\n<h3><\/h3>\n<h3>Sobre o Banco de dados:<\/h3>\n<p>Para voc\u00ea que \u00e9 novato no assunto e est\u00e1 se perguntando: o que \u00e9 um banco de dados (o que \u00e9 MySQL?)?<\/p>\n<p>Voc\u00ea deveria se perguntar: para que serve?<\/p>\n<p>(Pule esta parte se j\u00e1 souber)<\/p>\n<p>BD (banco de dados) \u00e9 um arquivo que armazena dados. Quando dizemos MySQL, SQlite3 ou Postgre etc. Estamos nos referindo ao programa ou biblioteca que tem as fun\u00e7\u00f5es necess\u00e1rias para criar e manipular o arquivo do banco de dados.<\/p>\n<p>Um banco de dados, por exemplo, pode armazenar clientes, produtos, telefones, etc. Muito \u00fatil em programas de lojas, Mercados, etc.<\/p>\n<p>Se voc\u00ea ainda quer mais detalhes sobre BD, d\u00ea uma breve volta pelo Gloogle.<\/p>\n<p>&nbsp;<\/p>\n<h3>Come\u00e7ando a programar:<\/h3>\n<p>&nbsp;<\/p>\n<hr \/>\n<h1>1 &#8211; Obtendo a vers\u00e3o:<\/h1>\n<p>Crie um arquivo prisma chamado versao.prisma em uma pasta espec\u00edfica para este tutorial. (D\u00ea prefer\u00eancia aos editores Geany ou Prismacod);<\/p>\n<pre class=\"lang:prisma decode:true\">local mysql = inclua'mysql'\r\n\r\nimprima('informacao cliente mysql:', mysql.obt_cliente_info() );\r\n\r\nimprima('versao desta lib:', mysql._versao );\r\n<\/pre>\n<p>Sa\u00edda:<\/p>\n<p>informacao cliente mysql:\u00a0\u00a0 \u00a05.5.54<br \/>\nversao desta lib:\u00a0\u00a0 \u00a0mysql para Prisma mysql-0.1<\/p>\n<pre class=\"lang:prisma decode:true\">local mysql = inclua'mysql'<\/pre>\n<p>Nesta linha a biblioteca mysql Prisma \u00e9 importada, com isso podemos usar suas fun\u00e7\u00f5es.<\/p>\n<pre class=\"lang:prisma decode:true\">mysql.obt_cliente_info()<\/pre>\n<p>Bem, a fun\u00e7\u00e3o imprima voc\u00eas j\u00e1 conhecem, ent\u00e3o vamos para essa acima. Ela retorna uma string com o n\u00famero da vers\u00e3o do cliente MySQL, n\u00e3o \u00e9 a vers\u00e3o da biblioteca Prisma!<\/p>\n<pre class=\"lang:prisma decode:true\">mysql._versao<\/pre>\n<p>Acima temos uma vari\u00e1vel reservada string com a descri\u00e7\u00e3o da vers\u00e3o da lib Prisma.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<h1>2 &#8211; Conex\u00e3o com o servidor MySQL e abertura do banco de dados:<\/h1>\n<p>Salve como criabd.prisma<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/exemplo de conexao e abertura de banco de dados:\r\n\r\ninclua'mysql'\r\nfuncao principal()                   \r\n  local host = 'localhost';\r\n  local user = 'root';\r\n  local senha = 'senha-do-servidor';\/\/coloque sua senha do servidor mysql aqui entre aspas.  \r\n  local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock'; \/\/arquivo socket unix.\r\n  local conexao, err = mysql.conecte(host,user,senha,nulo,nulo,sock);\r\n  se err entao\/\/se houver erro\r\n    imprima('Erro no mysql:', err);\/\/imprima o erro\r\n    conexao:feche();\/\/libera a conexao\r\n    sis.saia(1);\/\/retorna 1 e deixa a funcao principal finalizando o programa.\r\n  senao\r\n    local err = conexao:exec(\"CREATE DATABASE testedb\");\/\/note o uso dos dois pontos para m\u00e9todo exec\r\n    se err entao \r\n      imprima(\"Erro na execucao:\", err, 'Enter para sair');\r\n      leia();\r\n      sis.saia(1);\r\n    senao\r\n      imprima(\"Banco de dados criado com sucesso no servidor MySql\");\r\n    fim  \r\n  fim\r\n  \r\n  conexao:feche();\/\/fecha a conexao.\r\n  retorne 0;\/\/retorno ao sistema operacional\r\nfim<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">inclua'mysql'<\/pre>\n<p>Incluindo a biblioteca mysql.<\/p>\n<pre class=\"lang:prisma decode:true\">funcao principal()<\/pre>\n<p>Prisma 1.0.99 traz o conceito de fun\u00e7\u00e3o principal, a fun\u00e7\u00e3o com este nome ser\u00e1 chamada automaticamente pelo interpretador, \u00e9 como o main() do C. Lembre-se de fechar no final com o respectivo <strong>&#8216;fim&#8217;.<\/strong><\/p>\n<pre class=\"lang:prisma decode:true\">local host = 'localhost';<\/pre>\n<p>Esta \u00e9 uma vari\u00e1vel com o local (ip) do servidor MySQL.<\/p>\n<p style=\"padding-left: 30px;\"><em>&#8216;localhost&#8217; indica que o servidor est\u00e1 instalado no mesmo computador que o programa sendo executado. Se o MySQL estiver instalado em outro computador na rede, basta usar o n\u00famero ip dele entre aspas, ex.: local host = &#8216;192.168.1.100&#8217;;<br \/>\n<\/em><\/p>\n<pre class=\"lang:prisma decode:true\">local user = 'root';\r\nlocal senha = 'senha-do-servidor';<\/pre>\n<p>Acima temos o usu\u00e1rio e senha do MySQL.<\/p>\n<pre class=\"lang:prisma decode:true\">local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock'; \/\/arquivo socket unix.\r\n<\/pre>\n<p>Esta linha acima indica o caminho do arquivo socket unix, n\u00e3o \u00e9 necess\u00e1rio no Windows, pode deixar como nulo. Caso voc\u00ea tenha instalado o Servidor que n\u00e3o seja o Xampp, procure na documenta\u00e7\u00e3o o local do arquivo na sua instala\u00e7\u00e3o.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">local conexao, err = mysql.conecte(host,user,senha,nulo,nulo,sock);<\/pre>\n<p>Esta \u00e9 a fun\u00e7\u00e3o de conex\u00e3o com o MySQL,<\/p>\n<pre class=\"lang:prisma decode:true\">conexao, err = mysql.conecte(host,user,senha,Bd,porta,sock,flags);<\/pre>\n<h3>Par\u00e2metros:<\/h3>\n<p>host: o ip do servidor ou &#8216;localhost&#8217; se estiver na mesma m\u00e1quina do Xampp servidor MySQL;<\/p>\n<p>user: usu\u00e1rio (&#8216;root&#8217; ou outro criado por voc\u00ea &#8211; );<\/p>\n<p>senha: &#8216;senha&#8217; do MySQL;<\/p>\n<p>Bd: arquivo &#8216;banco de dados&#8217; ou nulo se voc\u00ea quiser abrir mais tarde. Ex.: &#8216;teste.db&#8217;;<\/p>\n<p>Porta: porta do servidor MySQL. (geralmente \u00e9 3306), ou nulo se estiver em &#8216;localhost&#8217;<\/p>\n<p>socket: \u00e9 o path completo do arquivo socket unix, s\u00f3 \u00e9 usado quando estiver em localhost, caso contrario deixe nulo.<\/p>\n<p>Ainda temos o \u00faltimo par\u00e2metro que foi omitido no exemplo, este par\u00e2metro \u00e9 um item de configura\u00e7\u00e3o (flag) da conex\u00e3o.<\/p>\n<p>Usaremos mais a frente quando precisarmos.<\/p>\n<h3><\/h3>\n<h3>Retornos:<\/h3>\n<p>conexao: \u00e9 o objeto MySQL com a conex\u00e3o e m\u00e9todos do banco de dados.<\/p>\n<p>err : \u00e9 o erro retornado. Nulo se n\u00e3o tiver erro.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">se err entao\/\/se houver erro<\/pre>\n<p>Nesta linha come\u00e7a o tratamento de erro, caso o valor da vari\u00e1vel err n\u00e3o seja nulo ent\u00e3o significa que algum erro aconteceu e sua descri\u00e7\u00e3o estar\u00e1 nela em forma de string.<\/p>\n<pre class=\"lang:prisma decode:true\">imprima('Erro no mysql:', err);\/\/imprima o erro\r\n    conexao:feche();\/\/libera a conexao\r\n    sis.saia(1);\/\/retorna 1 e deixa a funcao principal finalizando o programa.\r\n<\/pre>\n<p>Caso haja erro, esse comando acima \u00e9 executado:<\/p>\n<p>\u00c9 impresso o erro na tela, a conex\u00e3o \u00e9 fechada, e o programa \u00e9 fechado com sa\u00edda 1;<\/p>\n<p>Mas se n\u00e3o houver erro podemos prosseguir com o seguinte comando:<\/p>\n<pre class=\"lang:prisma decode:true\">senao\r\n    local err = conexao:exec(\"CREATE DATABASE testedb\");\/\/note o uso dos dois pontos para m\u00e9todo exec\r\n<\/pre>\n<p>Sen\u00e3o tiver erro, \u00e9 executado um comando SQL,<\/p>\n<p>CREATE DATABASE testedb;<\/p>\n<p>Significa: crie um banco de dados chamado testedb.<\/p>\n<h3>Par\u00e2metros:<\/h3>\n<p>String com comando MySQL.<\/p>\n<h3>Retorno:<\/h3>\n<p>err: string descrevendo o erro, ou nulo se n\u00e3o houver erro.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">se err entao \r\n      imprima(\"Erro na execucao:\", err, 'Enter para sair');\r\n      leia();\r\n      sis.saia(1);<\/pre>\n<p>Se a execu\u00e7\u00e3o da cl\u00e1usula SQL falhar, o erro retornado \u00e9 impresso na tela e o programa \u00e9 fechado com sa\u00edda 1;<\/p>\n<p>Obs.: O comando prisma &#8216;leia()&#8217; serve para o programa aguardar o usu\u00e1rio pressionar enter, assim d\u00e1 tempo de ler a mensagem de erro se houver.<\/p>\n<p>Obs. Voc\u00ea deve ter notado que nunca uso a vari\u00e1vel erro e sim err, pois erro j\u00e1 existe em prisma e \u00e9 uma fun\u00e7\u00e3o, lembra?!<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\"> senao\r\n      imprima(\"Banco de dados criado com sucesso no servidor MySql\");\r\n    fim  \r\n  fim\r\n<\/pre>\n<p>Se o comando SQL for executado com sucesso \u00e9 impresso a frase de sucesso na tela!<\/p>\n<p>os blocos se,senaose, s\u00e3o todos fechados com o respectivo &#8220;fim&#8221;;<\/p>\n<p>Obs. Tome cuidado, um fim a mais, ou faltando gera erro.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">conexao:feche();\/\/fecha a conexao.\r\n  retorne 0;\/\/retorno ao sistema operacional\r\nfim<\/pre>\n<p>No final do programa, nunca se esque\u00e7a de fechar a conex\u00e3o aberta com o comando acima.<\/p>\n<p>Ao usar a fun\u00e7\u00e3o principal() em prisma sempre retorne 0 no final, ok!<\/p>\n<p>&nbsp;<\/p>\n<h1>3 &#8211; Criando tabela e inserindo dados:<\/h1>\n<p>Salve como inserebd.prisma<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/exemplo de conexao e abertura de banco de dados:\r\n\r\ninclua'mysql'\r\n\r\n\r\nfuncao principal()\r\n  local host, user, senha, nome_bd = 'localhost','root','senha','testedb';\/\/multipla atribuicao\r\n  local sock_file = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/caminho do socket no servidor.\r\n  local conexao, err = mysql.conecte(host,user,senha,nome_bd,nulo,sock_file);\r\n  tem_erro(conexao,err);\/\/testando se h\u00e1 erro.  \r\n  err = conexao:exec(\"DROP TABLE IF EXISTS Carros\"); \/\/executa uma string de comando sql.\r\n  \/\/para mais detalhes procure um tutorial mais completo da linguagem sql usada no mysql.\r\n  tem_erro(conexao,err);\/\/testa novamente se h\u00e1 erro.\r\n  \r\n  \/\/criando a tabela:\r\n  err= conexao:execute(\"CREATE TABLE Carros(Id INT, Nome TEXT, Preco INT)\"); \r\n  tem_erro(conexao,err);\r\n  \r\n  \/\/inserindo dados:\r\n  err=conexao:exec(\"INSERT INTO Carros VALUES(1,'Audi',52642)\");\r\n  tem_erro(conexao,err);\r\n  \r\n  err=conexao:exec(\"INSERT INTO Carros VALUES(2,'Mercedes',57127)\");\r\n  tem_erro(conexao,err);\r\n  \r\n  err=conexao:exec(\"INSERT INTO Carros VALUES(3,'Skoda',9000)\");\r\n  tem_erro(conexao,err);\r\n  \r\n  \r\n err=conexao:exec(\"INSERT INTO Carros VALUES(4,'Volvo',29000)\");\r\n tem_erro(conexao,err);\r\n \r\n err=conexao:exec(\"INSERT INTO Carros VALUES(5,'Bentley',350000)\");\r\n tem_erro(conexao,err);\r\n\r\n err=conexao:exec(\"INSERT INTO Carros VALUES(6,'Citroen',21000)\");\r\n tem_erro(conexao,err);\r\n\r\n err=conexao:exec(\"INSERT INTO Carros VALUES(7,'Hummer',41400)\");\r\n tem_erro(conexao,err);\r\n\r\n conexao:exec(\"INSERT INTO Carros VALUES(8,'Volkswagen',21600)\");\r\n tem_erro(conexao,err);  \r\n \r\n imprima('Tabela criada e dados inseridos com sucesso!');\r\n conexao:feche();\/\/fecha a conexao.\r\n retorne 0;\/\/retorno ao sistema operacional\r\nfim\r\n\r\n\r\n\/\/funcao verifica se houve erro e fecha o programa se houver\r\n funcao tem_erro(con,err)\r\n  se err entao \r\n    con:feche();\r\n    imprima(err);\r\n    sis.saia(0);\r\n    leia();\r\n  fim\r\nfim\r\n<\/pre>\n<p>Detalhes:<\/p>\n<pre class=\"lang:prisma decode:true\">funcao principal()\r\n  local host, user, senha, nome_bd = 'localhost','root','senha','testedb';\/\/multipla atribuicao\r\n  local sock_file = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/caminho do socket no servidor.\r\n  local conexao, err = mysql.conecte(host,user,senha,nome_bd,nulo,sock_file);\r\n<\/pre>\n<p style=\"padding-left: 30px;\"><em>Note a m\u00faltipla atribui\u00e7\u00e3o de vari\u00e1veis em prisma! Para cada vari\u00e1vel separada por v\u00edrgula antes do igual temos um respectivo valor separado por v\u00edrgula depois do igual.<\/em><\/p>\n<p style=\"padding-left: 30px;\">Note tamb\u00e9m que desta vez usamos o quarto par\u00e2metro nome do banco de dados: testedb. Com isso a conex\u00e3o \u00e9 criada j\u00e1 com esse banco de dados aberto para manipularmos!<\/p>\n<p>Essa primeira parte voc\u00ea j\u00e1 sabe, passemos adiante.<\/p>\n<pre class=\"lang:prisma decode:true\">tem_erro(conexao,err);\/\/testando se h\u00e1 erro.<\/pre>\n<p>A fun\u00e7\u00e3o tem_erro() est\u00e1 desenvolvida no final do programa ap\u00f3s a fun\u00e7\u00e3o principal(); isso s\u00f3 \u00e9 poss\u00edvel quando usamos a fun\u00e7\u00e3o padr\u00e3o principal();\u00a0 Veja-a:<\/p>\n<pre class=\"lang:prisma decode:true\">funcao tem_erro(con,err)\r\n  se err entao \r\n    con:feche();\r\n    imprima(err);\r\n    sis.saia(0);\r\n    leia();\r\n  fim\r\nfim<\/pre>\n<p>Ela pega a conex\u00e3o e vari\u00e1vel err se encarregando de verificar se h\u00e1 um erro e caso haja fecha a conexao, imprime o erro e sai do programa.<\/p>\n<p>Caso n\u00e3o haja erro ela n\u00e3o faz nada.<\/p>\n<hr \/>\n<pre class=\"lang:prisma decode:true\">err = conexao:exec(\"DROP TABLE IF EXISTS Carros\"); \/\/executa uma string de comando sql.\r\n<\/pre>\n<p>Este comando acima executa uma cl\u00e1usula SQL, que significa:<\/p>\n<p>APAGUE TABELA Carros SE EXISTIR<\/p>\n<p>Par\u00e2metro: String de comandos MySQL;<\/p>\n<p>retorno:<\/p>\n<p>err: string de erro, ou nulo se n\u00e3o houver erros na execu\u00e7\u00e3o.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">tem_erro(conexao,err);\/\/testa novamente se h\u00e1 erro.\r\n<\/pre>\n<p>Novamente o tratamento de erros.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/criando a tabela:\r\n  err= conexao:execute(\"CREATE TABLE Carros(Id INT, Nome TEXT, Preco INT)\"); \r\n  tem_erro(conexao,err);<\/pre>\n<p>Acima criamos uma tabela chamada Carros com par\u00e2metros MySQL. O comando significa:<\/p>\n<p><strong>CRIE TABELA Carros com as colunas Id do tipo Inteiro, Coluna Nome do tipo Texto, Preco do tipo Inteiro.<\/strong><\/p>\n<p>E assim \u00e9 criada uma tabela no banco de dados testedb com tr\u00eas colunas.<\/p>\n<p style=\"padding-left: 30px;\"><em>Note que desta vez usamos conexao:execute ao inv\u00e9s de conexao:exec, use a forma que preferir pois as duas fazem a mesma coisa!<\/em><\/p>\n<p>O retorno \u00e9 a vari\u00e1vel de erro e \u00e9 feito o tratamento de erro novamente com a fun\u00e7\u00e3o tem_erro();<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>Depois de criar o banco de dados, criar a tabela Carros, podemos come\u00e7ar a colocar dados nessa tabela:<\/p>\n<pre class=\"lang:prisma decode:true\">err=conexao:exec(\"INSERT INTO Carros VALUES(1,'Audi',52642)\");\r\n  tem_erro(conexao,err);<\/pre>\n<p>O comando acima \u00e9 aquele que executa uma cl\u00e1usula MySQL, lembra?<\/p>\n<h3>Par\u00e2metro:<\/h3>\n<p>String de comando MySQL que significa:<\/p>\n<p><strong>INSIRA EM Carros VALORES: 1, &#8216;Audi&#8217;, 52642. Na mesma ordem das colunas criadas anteriormente.<\/strong><\/p>\n<h3>Retorno:<\/h3>\n<p>err: igual ao anterior, a vari\u00e1vel de erro.<\/p>\n<p>Ap\u00f3s a execu\u00e7\u00e3o \u00e9 feito o tratamento de erro com a fun\u00e7\u00e3o tem_erro();<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>Bem, os outros comandos s\u00e3o exatamente igual a este de cima, todos inserem dados.<\/p>\n<p>E no final temos:<\/p>\n<pre class=\"lang:prisma decode:true\">imprima('Tabela criada e dados inseridos com sucesso!');\r\n conexao:feche();\/\/fecha a conexao.\r\n retorne 0;\/\/retorno ao sistema operacional\r\nfim<\/pre>\n<p>Imprime a frase de sucesso, pois chegou at\u00e9 aqui sem erros.<\/p>\n<p>fecha a conex\u00e3o com o comando conexao:feche();<\/p>\n<p>e retorna 0 finalizando o programa!<\/p>\n<hr \/>\n<h1>4 &#8211; Lendo todos os dados da tabela<\/h1>\n<p>Salve com lendo_bd.prisma<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/lendo a tabela Carros do banco de dados criado no ex_3 \r\ninclua'mysql' \/\/incluindo biblioteca mysql \r\nfuncao principal()\r\n local host, user, senha, nome_bd = 'localhost','root','senha','testedb';\r\n local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\r\n local con, err = mysql.conecte(host, user, senha, nome_bd,nulo,sock);\r\n \r\n tem_erro(con,err);\r\n \/\/con recebe os metodos mysql, ao inves de usar msql.exec(con, 'str'); use:\r\n err = con-&gt;exec(\"SELECT * FROM Carros\");\/\/se preferir use -&gt; para acessar os metodos ao inves de :\r\n tem_erro(con,err);\r\n\r\n local resultado, err = con-&gt;obt_resultado();\/\/pegando o resultado executado acima.\r\n tem_erro(con,err);\r\n\r\n\/\/se preferir use num_campos = msql.num_campos(resultado);\/\/d\u00e1 na mesma, ou siga o modelo objeto:\r\n local num_campos = resultado-&gt;num_campos();\/\/pegando o numero de campos na tabela Carros.\r\n\r\n local lin;\r\n imprima('-------------------\\nseq. Carro     preco\\n');\r\n enquanto 1 inicio \/\/pegando cada linha a partir do resultado.\r\n   lin = resultado-&gt;obt_linha();\/\/lin \u00e9 uma tabela prisma contendo os campos da linha lida \r\n   se lin entao \/\/se linha nao for nulo.     \r\n     para i=1, num_campos inicio imprimaf(\"%s    \", lin[i]) fim;\r\n     poe'';\/\/para imprimir uma linha em branco no terminal.\r\n   senao\r\n     quebre; \/\/quebra o laco enquanto...\r\n   fim\r\n fim\/\/fim enquanto\r\n resultado-&gt;feche();\/\/liberando o retorno de leitura mysql.\r\n con-&gt;feche(); \/\/liberando a conexao mysql.\r\n retorne 0;\r\nfim \/\/fim funcao principal();\r\n\r\n\r\n\/\/funcao para saida de erro caso houver.\r\nfuncao tem_erro(con,err)\r\n  se err entao \r\n    con-&gt;feche();\r\n    imprima(err);\r\n    leia();\r\n    sis.saia(1);\r\n  fim\r\nfim\r\n<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2695 size-full\" src=\"https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/02\/terminal_ex4.png\" alt=\"terminal_ex4\" width=\"655\" height=\"460\" srcset=\"https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/02\/terminal_ex4.png 655w, https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/02\/terminal_ex4-300x211.png 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/p>\n<p>Detalhes:<\/p>\n<pre class=\"lang:prisma decode:true\">inclua'mysql' \/\/incluindo biblioteca mysql \r\nfuncao principal()<\/pre>\n<p>O trecho acima inclua a biblioteca mysql Prisma e inicia a fun\u00e7\u00e3o principal();<\/p>\n<pre class=\"lang:prisma decode:true\">local host, user, senha, nome_bd = 'localhost','root','senha','testedb';\r\n local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\r\n local con, err = mysql.conecte(host, user, senha, nome_bd,nulo,sock);\r\n \r\n tem_erro(con,err);<\/pre>\n<p>Nos comandos acima iniciamos a conex\u00e3o com o servidor MySQL e tratamos do erro com a fun\u00e7\u00e3o tem_erro() igual ao exemplo anterior. Como j\u00e1 vimos esse c\u00f3digo antes, n\u00e3o entrarei em detalhes.<\/p>\n<pre class=\"lang:prisma decode:true \">err = con-&gt;exec(\"SELECT * FROM Carros\");\/\/se preferir use -&gt; para acessar os metodos ao inves de :\r\n tem_erro(con,err);<\/pre>\n<p>Executamos acima o comando MySQL &#8216;SELECT * FROM Carros&#8217; que significa:<\/p>\n<p>SELECIONE TODAS AS COLUNAS (*) da tabela Carros.<\/p>\n<p>Note que ao inv\u00e9s dos dois-pontos eu usei &#8220;-&gt;&#8221; para acessar o m\u00e9todo exec. Isso \u00e9 poss\u00edvel na vers\u00e3o Prisma-1.0.99 ou superior. Voc\u00ea escolhe, se preferir use &#8216;:&#8217; ou &#8216;-&gt;&#8217; para acessar m\u00e9todos de tabelas.<\/p>\n<p>Par\u00e2metro: string de comando MySQL<\/p>\n<p>retorno: string de erro, ou nulo se n\u00e3o houver erro.<\/p>\n<p>Ap\u00f3s a execu\u00e7\u00e3o \u00e9 feito o tratamento de erro com a fun\u00e7\u00e3o tem_erro();<\/p>\n<h3>Dicas:<\/h3>\n<p>Se voc\u00ea quisesse obter apenas uma linha espec\u00edfica adicione WHERE col = valor no fim do comando MySQL, ex.:<\/p>\n<pre class=\"lang:prisma decode:true\">err = con-&gt;exec(\"SELECT * FROM Carros WHERE Id = 3\");<\/pre>\n<p>No caso acima, ter\u00edamos apenas a linha 3 selecionada.<\/p>\n<pre class=\"lang:prisma decode:true\">err = con-&gt;exec(\"SELECT * FROM Carros WHERE Nome = 'Audi'\");<\/pre>\n<p>Acima, seriam selecionadas todas as colunas onde Nome for igual a Audi.<\/p>\n<pre class=\"lang:prisma decode:true\">err = con-&gt;exec(\"SELECT * FROM Carros WHERE Id &gt; 2 AND Id &lt; 5\");<\/pre>\n<p>J\u00e1 aqui teriamos as linhas onde Id for maior que 2 e menor que 5, ou seja, linhas 3 e 4;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">local resultado, err = con-&gt;obt_resultado();\/\/pegando o resultado executado acima.\r\n tem_erro(con,err);<\/pre>\n<p>A primeira fun\u00e7\u00e3o acima pega o resultado obtido da execu\u00e7\u00e3o da cl\u00e1usula MySQL.<\/p>\n<p><strong>Par\u00e2metros: vazio.<\/strong><\/p>\n<p><strong>retornos:<\/strong><\/p>\n<p>resultado: objeto que cont\u00e9m o resultado da execu\u00e7\u00e3o MySQL.<\/p>\n<p>err: string de erro, ou nulo se n\u00e3o houver erro.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">local num_campos = resultado-&gt;num_campos();\/\/pegando o numero de campos na tabela Carros.\r\n<\/pre>\n<p>Acima temos uma fun\u00e7\u00e3o \u00fatil para sabermos automaticamente o n\u00famero de campos da tabela, ou seja, quantas colunas ela tem.<\/p>\n<hr \/>\n<pre class=\"lang:prisma decode:true\">local lin;\r\n imprima('-------------------\\nseq. Carro     preco\\n');\r\n enquanto 1 inicio \/\/pegando cada linha a partir do resultado.<\/pre>\n<p>Criamos a variavel lin (linha), imprimimos os nomes das colunas.<\/p>\n<p>E iniciamos o la\u00e7o de repeti\u00e7\u00e3o enquanto que ir\u00e1 percorrer e ler cada linha de dado da tabela MySQL.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\"> lin = resultado-&gt;obt_linha();\/\/lin \u00e9 uma tabela prisma contendo os campos da linha lida \r\n<\/pre>\n<p>Lendo a linha da tabela, cada vez que essa fun\u00e7\u00e3o (resultado-&gt;obt_linha();) \u00e9 repetida ela percorre uma linha da tabela do banco de dados, retornando nulo ap\u00f3s chegar ao fim.<\/p>\n<p>Obs. Ela percorre todas as linhas obtidas pelo comando SELECT, ent\u00e3o se voc\u00ea selecionar apenas uma linha com o SELECT s\u00f3 ser\u00e1 poss\u00edvel ler uma linha.<\/p>\n<p>Como selecionamos todas as linhas da tabela, teremos v\u00e1rios resultados.<\/p>\n<p><strong>Par\u00e2metros: vazio.<\/strong><\/p>\n<p><strong>Retorno:<\/strong><\/p>\n<p>lin: tabela contendo informa\u00e7\u00f5es do resultado lido no comando exec();<\/p>\n<p style=\"padding-left: 30px;\">Essa tabela cont\u00eam os valores, igual ao n\u00famero de colunas:<\/p>\n<p style=\"padding-left: 30px;\">lin[1] = valor_da_coluna1,<\/p>\n<p style=\"padding-left: 30px;\">lin[2] = valor_da_coluna2,<\/p>\n<p style=\"padding-left: 30px;\">lin[3] = valor_da_coluna3.<\/p>\n<p>De cada linha lida, \u00e9 claro!<\/p>\n<p><em>Obs. Se tiv\u00e9ssemos criado uma tabela com 4 colunas ter\u00edamos lin[4]!<\/em><\/p>\n<hr \/>\n<pre class=\"lang:prisma decode:true\">se lin entao \/\/se linha nao for nulo.     \r\n     para i=1, num_campos inicio imprimaf(\"%s    \", lin[i]) fim;\r\n     poe'';\/\/para imprimir uma linha em branco no terminal.<\/pre>\n<p>se linha for v\u00e1lida (diferente de nulo ou falso) podemos usar seus valores, imprimindo-os todos com o comando para:<\/p>\n<p><em>para i que \u00e9 1 at\u00e9 o n\u00famero de colunas, imprima as linhas. fim<\/em><\/p>\n<p>o poe&#8221; \u00e9 para pular uma linha na tela do terminal ou cmd.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">senao\r\n     quebre; \/\/quebra o laco enquanto...\r\n   fim\r\n fim\/\/fim enquanto<\/pre>\n<p>Caso o retorno de lin seja nulo (n\u00e3o existe mais linhas a serem lidas), o la\u00e7o de repeti\u00e7\u00e3o enquanto \u00e9 interrompido com o comando quebre;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p><strong>Saindo do la\u00e7o enquanto:<\/strong><\/p>\n<pre class=\"lang:prisma decode:true\">resultado-&gt;feche();\/\/liberando o retorno de leitura mysql.\r\n con-&gt;feche(); \/\/liberando a conexao mysql.\r\n retorne 0;\r\nfim \/\/fim funcao principal();<\/pre>\n<p>Fechamos o objeto resultado com a fun\u00e7\u00e3o -&gt;feche();<\/p>\n<p>Fechamos o objeto de conex\u00e3o con;<\/p>\n<p>retornamos 0 e finalizamos a fun\u00e7\u00e3o principal() com seu respectivo fim!<\/p>\n<hr \/>\n<h1>5 &#8211; Lendo o n\u00famero do \u00faltimo id inserido<\/h1>\n<p>Salve como ultimo_id.prisma<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/pegando o ultimo id inserido:\r\n\r\nlocal sql = inclua'mysql';\r\n\r\nfuncao tem_erro(con,err,str)\r\n  se err entao\r\n    sql.feche(con);\r\n    erro(\"Erro no MySql: \" .. err);\r\n  senao\r\n    imprima(str);\r\n  fim\r\nfim\r\n\r\nfuncao principal()\r\n local host = 'localhost';\r\n local user = 'usuario'; \r\n local senha = 'senha'; \/\/coloque senha do servidor aqui.\r\n local bd = 'testedb'; \/\/nome do banco de dados j\u00e1 criado\r\n local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\r\n \r\n local con, err = sql.conecte(host, user, senha, bd,nulo,sock);\r\n tem_erro(con,err, 'conexao realizada');\r\n \r\n err = con:exec(\"DROP TABLE IF EXISTS Filosofos\");\r\n tem_erro(con,err,'');\r\n sql_cmd = \"CREATE TABLE Filosofos(Id INT PRIMARY KEY AUTO_INCREMENT, Name TEXT)\";\r\n err = con:exec(sql_cmd);\r\n tem_erro(con,err,'tabela Filosofos criada');\r\n \r\n err = con:exec(\"INSERT INTO Filosofos(Name) VALUES('Socrates')\");\r\n tem_erro(con,err,'dado inserido');\r\n \r\n err = con:exec(\"INSERT INTO Filosofos(Name) VALUES('Platao')\");\r\n tem_erro(con,err,'dado inserido');\r\n \r\n err = con:exec(\"INSERT INTO Filosofos(Name) VALUES('Aristoteles')\");\r\n tem_erro(con,err,'dado inserido');\r\n \r\n imprimaf(\"O ultimo id inserido \u00e9: %d\\n\", con:ultimo_id() );\r\n con:feche(); \r\n retorne 0;\r\nfim<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2700 size-full\" src=\"https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/02\/terminal_ex5.png\" alt=\"terminal_ex5\" width=\"655\" height=\"460\" srcset=\"https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/02\/terminal_ex5.png 655w, https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/02\/terminal_ex5-300x211.png 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/p>\n<p>Detalhes:<\/p>\n<p>Aten\u00e7\u00e3o vou pular comandos j\u00e1 explicados anteriormente, vamos direto ao que interessa.<\/p>\n<pre class=\"lang:prisma decode:true\">err = con:exec(\"DROP TABLE IF EXISTS Filosofos\");\r\ntem_erro(con,err,'');<\/pre>\n<p>Executando um comando MySQL e tratando do erro. Lembre-se que esse comando acima apaga a tabela se ela j\u00e1 existir;<\/p>\n<pre class=\"lang:prisma decode:true\">sql_cmd = \"CREATE TABLE Filosofos(Id INT PRIMARY KEY AUTO_INCREMENT, Name TEXT)\";\r\n err = con:exec(sql_cmd);<\/pre>\n<p>Criamos a vari\u00e1vel que cont\u00e9m a string de comandos MySQL, e depois a executamos com o con:exec();<\/p>\n<p>Veja que criamos a tabela com a coluna Id int chave prim\u00e1ria de auto incremento, \u00e9 necess\u00e1rio este comando MySQL para pegarmos o valor do \u00faltimo Id inserido.<\/p>\n<p>O comando SQL acima significa:<\/p>\n<p><strong>CRIE TABELA Filosofos com: coluna Id do tipo Inteiro Chave prim\u00e1ria de auto incremento, coluna Name do tipo Texto.<\/strong><\/p>\n<p>Ap\u00f3s isso \u00e9 feito o tratamento de erro com a fun\u00e7\u00e3o tem_erro() que agora possui uma novidade: o terceiro par\u00e2metro como mensagem de sucesso.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\"> err = con:exec(\"INSERT INTO Filosofos(Name) VALUES('Socrates')\");\r\n tem_erro(con,err,'dado inserido');<\/pre>\n<p>Acima inserimos os dados na tabela Filosofos, veja que escolhemos as colunas deixando Id de fora pois ela \u00e9 uma chave de auto incremento (adiciona 1 a cada inser\u00e7\u00e3o);<\/p>\n<p>Escolhemos que coluna inserir atrav\u00e9s do uso de par\u00eanteses.<\/p>\n<p><strong>INSIRA EM Filosofos (na coluna Name) VALORES(&#8216;Socrates&#8217;);<\/strong><\/p>\n<p>Se houvesse mais colunas bastaria separ\u00e1-las por v\u00edrgulas entre os par\u00eanteses, veja um exemplo:<\/p>\n<pre class=\"\">INSERT INTO contatos (nome, telefone) VALUES (\"Jose Santos\", \"572593478832\");<\/pre>\n<p>Como os comandos posteriores ao de cima s\u00e3o iguais, apenas inserem novos dados na tabela, passemos aos \u00fatlimos comandos:<\/p>\n<hr \/>\n<pre class=\"lang:prisma decode:true\"> imprimaf(\"O ultimo id inserido \u00e9: %d\\n\", con:ultimo_id() );<\/pre>\n<p>Enfim, para pegar o \u00faltimo Id inserido use esta fun\u00e7\u00e3o acima:<\/p>\n<p><strong><em>con:ultimo_id();<\/em><\/strong><\/p>\n<p><strong>Par\u00e2metros: vazio;<\/strong><\/p>\n<p><strong>Retornos:<\/strong> n\u00famero prisma representando o valor do \u00faltimo id;<\/p>\n<p>Por fim fechamos a conex\u00e3o e finalizamos o programa:<\/p>\n<pre class=\"lang:prisma decode:true\"> con:feche(); \r\n retorne 0;\r\nfim<\/pre>\n<hr \/>\n<p>A esta altura voc\u00ea j\u00e1 deve estar se questionando: como fa\u00e7o para inserir dados dinamicamente em tempo de execu\u00e7\u00e3o usando vari\u00e1veis.<\/p>\n<p>A resposta \u00e9 mais simples do que voc\u00ea imagina: lembra do operador de unir strings .. , pois \u00e9, use-o. Lembra da fun\u00e7\u00e3o string.formate(), use-a tamb\u00e9m.<\/p>\n<p>Ex.:<\/p>\n<p>Usando string.formate();<\/p>\n<pre class=\"lang:prisma decode:true \">fun\u00e7\u00e3o insira_bd(con,tab_nome,col_nome,col_valor)\r\n local cmd_insira = \"INSERT INTO %s(%s) VALUES('%s')\";\r\n cmd_exec = string.formate(cmd_insira,tab_nome,col_nome, col_valor);\r\n local err = con:exec(cmd_exec);\r\n se err entao \r\n   retorne err;\r\n senao\r\n   retorne nulo;\r\n fim\r\nfim\r\n<\/pre>\n<p>Usando operador de uni\u00e3o de strings:<\/p>\n<pre class=\"lang:prisma decode:true\">fun\u00e7\u00e3o insira_bd(con,tab_nome,col_nome,col_valor)\r\n local cmd_insira = \"INSERT INTO \" .. tab_nome .. \"(\" .. col_nome .. \") VALUES('\" .. col_valor .. \"')\";  \r\n local err = con:exec(cmd_insira);\r\n se err entao \r\n   retorne err;\r\n senao\r\n   retorne nulo;\r\n fim\r\nfim<\/pre>\n<p>\u00c9 claro que os c\u00f3digos acima n\u00e3o tem nenhum tratamento de erro com os par\u00e2metros recebidos, imagine se &#8216;con&#8217; ou outro par\u00e2metro fosse nulo! Geraria um erro fatal.<\/p>\n<p>Voc\u00ea mesmo pode fazer o tratamento de erro, o c\u00f3digo \u00e9 simples:<\/p>\n<p>se con == nulo entao retorne nulo fim; e assim com os demais par\u00e2metros.<\/p>\n<p>&nbsp;<\/p>\n<h1>6 &#8211; Obtendo o nome das colunas<\/h1>\n<p>&nbsp;<\/p>\n<p>As vezes voc\u00ea n\u00e3o saber\u00e1 quais colunas tem uma tabela em um banco de dados. Para descobrir os nomes basta usar um comando espec\u00edfico do MySQL:<\/p>\n<p><strong>local col = resultado-&gt;obt_coluna();<\/strong><\/p>\n<p>Veja um exemplo completo de uso:<\/p>\n<p>Salve como nome_col.prisma<\/p>\n<pre class=\"lang:prisma decode:true \">\/\/pegando os nomes das colunas:\r\n\r\nlocal sql = inclua'mysql' \r\n\r\nfuncao tem_erro(con,err,str)\r\n  se err entao\r\n    con-&gt;feche();\r\n    erro(\"Erro: \" .. err);\r\n  senao\r\n    local str = str ou '';\r\n    imprima(str);\r\n  fim\r\nfim\r\n\r\nfuncao principal()\r\n  local host, user, senha, bd = 'localhost','usuario','12345','testedb';\r\n  local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/elimine essa linha se seu servidor MySQL for Windows.\r\n  local con, err = sql.conecte(host,user,senha,bd,3306,sock);\r\n  tem_erro(con,err,'conexao realizada');\r\n  \r\n  err = con-&gt;exec(\"SELECT * FROM Carros LIMIT 3\");\/\/Limite de 3 itens a serem lidos. \r\n  tem_erro(con,err,'Tabela selecionada limite 3'); \r\n  local resultado, err = con-&gt;obt_resultado();\/\/pegando o resultado da string executada.\r\n  tem_erro(con,err);\r\n  \r\n  local lin;\r\n  local col = resultado-&gt;obt_coluna();\r\n  poe'Nome das colunas:\\n--------------------'\r\n  para i,v em ipares(col) inicio\r\n    imprimaf(\"%s  \", v);\r\n  fim\r\n  poe'\\n--------------------';\r\n  \r\n  enquanto 1 inicio\/\/laco infinito\r\n    local lin = resultado-&gt;obt_linha();\r\n    se lin entao\r\n      para i,v em ipares(lin) inicio\r\n        imprimaf(\"%s     \", v);\r\n      fim\r\n        poe'';\r\n    senao\r\n      quebre;\/\/acabou as linhas, interrompe o la\u00e7o.\r\n    fim\r\n  \r\n  fim\r\n  \r\n  resultado-&gt;feche();\r\n  con-&gt;feche();\r\n  retorne 0;\r\nfim\/\/fim principal();\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Detalhes:<\/p>\n<p>Vamos pular o que j\u00e1 foi explicado, a novidade aqui \u00e9:<\/p>\n<pre class=\"lang:prisma decode:true\">err = con-&gt;exec(\"SELECT * FROM Carros LIMIT 3\");<\/pre>\n<p>Executa a string de comando MySQL:<\/p>\n<pre class=\"lang:prisma decode:true\">\"SELECT * FROM Carros LIMIT 3\"<\/pre>\n<p>Seleciona tudo da tabela Carros com o limite de 3 linhas.<\/p>\n<pre class=\"lang:prisma decode:true\"> local resultado, err = con-&gt;obt_resultado();<\/pre>\n<p>Acima usamos a fun\u00e7\u00e3o para obter o resultado da execu\u00e7\u00e3o do comando MySQL.<\/p>\n<pre class=\"lang:prisma decode:true\">local col = resultado-&gt;obt_coluna();<\/pre>\n<p>Aqui em cima pegamos os nomes das colunas existentes na tabela Carros. O retorne \u00e9 uma tabela.<\/p>\n<p>Esta tabela cont\u00e9m \u00edndices e cada um deles cont\u00e9m o nome da coluna.<\/p>\n<p>Ex.:<\/p>\n<p>col[1] = &#8216;nome coluna1&#8217;;<\/p>\n<p>col[2] = &#8216;nome coluna2&#8217;;<\/p>\n<p>etc.<\/p>\n<p>O n\u00famero de elementos da tabela corresponde ao n\u00famero de colunas existentes, portanto podemos saber este n\u00famero usando o operador de tamanho: num_col = #col;<\/p>\n<pre class=\"lang:prisma decode:true\">para i,v em ipares(col) inicio\r\n    imprimaf(\"%s  \", v);\r\nfim<\/pre>\n<p>Acima usamos um la\u00e7o de repeti\u00e7\u00e3o &#8216;para&#8217; e imprimimos cada elemento da tabela &#8216;col&#8217; correspondente ao nome de cada coluna.<\/p>\n<p>Abaixo fazemos o mesmo com as linhas (j\u00e1 foi explicado nos exemplos anteriores!)<\/p>\n<pre class=\"lang:prisma decode:true\">enquanto 1 inicio\/\/laco infinito\r\n    local lin = resultado-&gt;obt_linha();\r\n    se lin entao\r\n      para i,v em ipares(lin) inicio\r\n        imprimaf(\"%s     \", v);\r\n      fim\r\n        poe'';\r\n    senao\r\n      quebre;\/\/acabou as linhas, interrompe o la\u00e7o.\r\n    fim<\/pre>\n<p>Com cuidado fechamos os objetos abertos e finalizamos retornando 0 ao sistema operacional:<\/p>\n<pre class=\"lang:prisma decode:true\"> resultado-&gt;feche();\r\n con-&gt;feche();\r\n retorne 0;<\/pre>\n<hr \/>\n<p>&nbsp;<\/p>\n<h1>7 &#8211; Executando m\u00faltiplos comandos MySQL<\/h1>\n<p>Caso voc\u00ea queira \u00e9 poss\u00edvel executar de uma s\u00f3 vez m\u00faltiplos comandos, veja abaixo o exemplo:<\/p>\n<p>Salve como multi_cmd.prisma<\/p>\n<pre class=\"lang:prisma decode:true \">\/\/multiplos comandos sql\r\n\r\nlocal sql = inclua'mysql'\r\n\r\nfuncao principal()\r\n local host = 'localhost'; \r\n local user = 'usuario'; \r\n local senha = '12345';\r\n local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/apaque esta linha se seu servidor Xampp for windows.\r\n local nome_bd = 'testedb';\r\n local porta = 3306;\r\n local modo_mult = sql.CLIENTE_MULTI_CMD; \r\n \/\/os outro parametros sao opcionais, mas agora precisamos deles: \r\n local con, err = sql.conecte(host, user, senha, nome_bd,porta,sock, modo_mult);\r\n tem_erro(con,err,'conexao realizada, modo multi_cmd');\r\n \r\n \/\/como definimos CLIENTE_MULTI_CMD \r\n \/\/entao podemos definir multiplos comando sql numa mesma execu\u00e7\u00e3o, veja:\r\n \r\n err = con:exec(\"SELECT Nome FROM Carros WHERE Id=2;\\\r\n SELECT Nome FROM Carros WHERE Id=3;\\\r\n SELECT Nome FROM Carros WHERE Id=6\");\r\n \r\n tem_erro(con,err,'executando comando sql');\r\n \/\/obtendo os valores:\r\n\r\n local status = 0;\r\n enquanto status == 0 inicio\r\n   local resultado, err = con:obt_resultado();\r\n   tem_erro(con,err);\r\n   local lin = resultado:obt_linha();\r\n   se lin e status == 0 entao\r\n       imprimaf(\"%s    \", lin[1]);\r\n     poe'';\r\n     resultado:feche();\/\/fechando o resultado para pegar o proximo comando.\r\n     status = con:proximo();\/\/enquanto houver proximo comando o retorno \u00e9 0;\r\n   fim  \r\n   se status &gt; 0 entao erro(\"Erro: \", con:erro() ); fim;\r\n    \r\n fim\r\n \r\n se resultado entao resultado:feche(); fim\r\n con:feche();\r\n retorne 0;\r\nfim \/\/fim principal()\r\n\r\nfuncao tem_erro(con,err,str)\r\n  se err entao\r\n    con:feche();\r\n    erro(\"Erro no MySql: \" .. err);\r\n  senao\r\n    se str entao\r\n      imprima(str);\r\n    fim\r\n  fim\r\nfim \r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Detalhes:<\/p>\n<p>A novidade \u00e9 o uso da seguinte vari\u00e1vel:<\/p>\n<pre class=\"lang:prisma decode:true\">local modo_mult = sql.CLIENTE_MULTI_CMD;<\/pre>\n<p>Significa Cliente multiplos comandos.<\/p>\n<p>Esta vari\u00e1vel \u00e9 passada como o \u00faltimo par\u00e2metro para a fun\u00e7\u00e3o de conex\u00e3o, ela \u00e9 um flag que muda a configura\u00e7\u00e3o da conex\u00e3o neste caso faz com que a conex\u00e3o com o servidor aceite m\u00faltiplos comandos em uma \u00fanica string.<\/p>\n<p>Veja a fun\u00e7\u00e3o de conex\u00e3o:<\/p>\n<pre class=\"lang:prisma decode:true\">local con, err = sql.conecte(host, user, senha, nome_bd,porta,sock, modo_mult);\r\n<\/pre>\n<hr \/>\n<pre class=\"lang:prisma decode:true\"> err = con:exec(\"SELECT Nome FROM Carros WHERE Id=2;\\\r\n SELECT Nome FROM Carros WHERE Id=3;\\\r\n SELECT Nome FROM Carros WHERE Id=6\");<\/pre>\n<p>A fun\u00e7\u00e3o acima executa a seguinte string MySQL:<\/p>\n<pre class=\"lang:prisma decode:true\">\"SELECT Nome FROM Carros WHERE Id=2;\\\r\n SELECT Nome FROM Carros WHERE Id=3;\\\r\n SELECT Nome FROM Carros WHERE Id=6\"<\/pre>\n<p>Na string acima selecionamos v\u00e1rias linhas com Id igual a 2, 3 e 6.<\/p>\n<p>M\u00faltiplos comandos geram m\u00faltiplos resultados.<\/p>\n<pre class=\"lang:prisma decode:true\">local status = 0;\r\n enquanto status == 0 inicio<\/pre>\n<p>Para percorrer todos os resultados iniciamos um la\u00e7o enquanto cujo teste condicional \u00e9 status == 0;. A vari\u00e1vel status \u00e9 usada para testar se h\u00e1 mais resultados ou n\u00e3o, o retorno deve sempre ser zero ou outro n\u00famero quando n\u00e3o houver mais retornos de resultados.<\/p>\n<pre class=\"lang:prisma decode:true\"> local resultado, err = con:obt_resultado();<\/pre>\n<p>Acima obtemos o primeiro resultado do la\u00e7o enquanto.<\/p>\n<pre class=\"lang:prisma decode:true\">local lin = resultado:obt_linha();<\/pre>\n<p>Neste trecho obtemos a lin (ou nulo caso n\u00e3o haja linha no retorno);<\/p>\n<pre class=\"lang:prisma decode:true\"> se lin e status == 0 entao<\/pre>\n<p>Testa se lin \u00e9 uma linha v\u00e1lida e se status indica resultado v\u00e1lido.<\/p>\n<pre class=\"lang:prisma decode:true\"> imprimaf(\"%s    \", lin[1]);\r\n poe'';<\/pre>\n<p>Caso lin seja v\u00e1lida e status zero, podemos ler imprimir a linha. Neste caso apenas o valor da coluna 1;<\/p>\n<p>O poe&#8221; \u00e9 para pular uma linha no terminal ou cmd.<\/p>\n<pre class=\"lang:prisma decode:true\">resultado:feche();<\/pre>\n<p>Devemos fechar o resultado para pegarmos o pr\u00f3ximo!<\/p>\n<pre class=\"lang:prisma decode:true\">status = con:proximo();<\/pre>\n<p>A fun\u00e7\u00e3o acima passa para o pr\u00f3ximo resultado. Se status for igual a zero ent\u00e3o temos um novo resultado v\u00e1lido, bastando usar novamente a fun\u00e7\u00e3o con:obt_resultado() para reiniciar o processo, isso \u00e9 feito com o la\u00e7o de repeti\u00e7\u00e3o &#8216;enquanto&#8217;;<\/p>\n<p>status = conexao:proximo();<\/p>\n<p>Par\u00e2metro: vazio;<\/p>\n<p>Retornos:<\/p>\n<p>1 &#8211; status: n\u00famero que indica sucesso se for igual a zero ou erro (n\u00e3o h\u00e1 mais resultados) se for maior que zero.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">se status &gt; 0 entao erro(\"Erro: \", con:erro() ); fim;<\/pre>\n<p>Acima temos o teste para continuar ou interromper o la\u00e7o &#8216;enquanto&#8217;;<\/p>\n<p>Detalhe aqui para a fun\u00e7\u00e3o erro() do MySQL:<\/p>\n<pre class=\"lang:prisma decode:true\">con:erro()<\/pre>\n<p>Retorna uma string descrevendo o \u00faltimo erro se houver.<\/p>\n<p>Ap\u00f3s isso finalizamos a fun\u00e7\u00e3o principal() retornando zero ao sistema operacional.<\/p>\n<pre class=\"lang:prisma decode:true\">retorne 0;\r\nfim \/\/fim principal()<\/pre>\n<p>Abaixo temos a implementa\u00e7\u00e3o da fun\u00e7\u00e3o que trata dos erros:<\/p>\n<pre class=\"lang:prisma decode:true\">funcao tem_erro(con,err,str)\r\n  se err entao\r\n    con:feche();\r\n    erro(\"Erro no MySql: \" .. err);\r\n  senao\r\n    se str entao\r\n      imprima(str);\r\n    fim\r\n  fim\r\nfim<\/pre>\n<hr \/>\n<h1>8 &#8211; Colocando uma imagem no banco de dados<\/h1>\n<p>A l\u00f3gica \u00e9 abrir a imagem em modo binario, ler todo o conte\u00fado, codific\u00e1-la para evitar erros de caracteres especiais e inseri-la em uma tabela do MySQL.<\/p>\n<p>Vamos ao c\u00f3digo:<\/p>\n<p>Salve como insere_img.prisma<\/p>\n<pre class=\"lang:prisma decode:true \">\/\/gravando imagem no bd\r\n\r\nlocal sql = inclua'mysql'\r\n\r\nfuncao principal()\r\n  local a = es.abra('img.jpg','leiturabin');\r\n  se a entao\r\n    txt = a:leia(\"*t\");\/\/ *t = l\u00ea tudo.\r\n    a:feche();\r\n  senao \r\n    erro(\"N\u00e3o foi possivel abrir a imagem\");\r\n  fim\r\n  \r\n  \/\/abrindo banco de dados:  \r\n  local host = 'localhost';\r\n  local user = 'usuario';\r\n  local senha = '12345';\r\n  local bd = 'testedb';\r\n  local porta = 3306;\r\n  local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/apague esta linha se seu servidor Xampp for Windows.\r\n  local con, err = sql.conecte(host, user, senha, bd,porta,sock);\r\n  tem_erro(con,err);\r\n  \/\/convertendo a string binaria da imagem para formato seguro do sql:\r\n  local imgstr = string.base64(txt);\/\/codifica a string em base64 evitando conflitos de caracteres especiais.\r\n  imprima( imgstr);\r\n  \/\/colocando a string da imagem dentro do comando sql usando string.formate();\r\n  local sql_cmd = string.formate(\"INSERT INTO Filosofos(Id, Name) VALUES(10 , '%s')\", imgstr);\r\n  \/\/imgstr ficara no lugar de %s dentro da primeira string\r\n  err = con:exec(\"DROP TABLE IF EXISTS Filosofos\");\r\n  tem_erro(con,err);\r\n  sql_crie_tab = \"CREATE TABLE Filosofos(Id INT PRIMARY KEY AUTO_INCREMENT, Name TEXT)\";\r\n  err = con:exec(sql_crie_tab);\r\n  tem_erro(con,err);\r\n  err = con:exec(sql_cmd);\/\/real_exec para dados binarios, senao nao funciona.\r\n  tem_erro(con,err,'\\nDado gravado com sucesso!');  \r\n  \r\n  con:feche();\r\n  retorne 0;\r\nfim \/\/fim principal()\r\n\r\nfuncao tem_erro(con,err,str)\r\n  se err entao \r\n    con:feche();\r\n    erro( err );\r\n  senao\r\n    se str entao imprima(str) fim;\r\n  fim\r\nfim\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Detalhes:<\/p>\n<pre class=\"lang:prisma decode:true\">local a = es.abra('img.jpg','leiturabin');\r\n  se a entao\r\n    txt = a:leia(\"*t\");\/\/ *t = l\u00ea tudo.\r\n    a:feche();\r\n  senao \r\n    erro(\"N\u00e3o foi possivel abrir a imagem\");\r\n  fim<\/pre>\n<p>Neste ponto abrimos o arquivo da imagem em modo leitura bin\u00e1ria usando fun\u00e7\u00f5es da biblioteca de entrada e sa\u00edda &#8216;es&#8217;. (troque img.jpg pelo nome de sua imagem alvo.)<\/p>\n<p>Verificamos se a imagem foi aberta, caso sim, lemos o todo o conte\u00fado e fechamos o objeto do arquivo aberto, caso contr\u00e1rio (senao) uma mensagem de erro \u00e9 impressa finalizando o programa.<\/p>\n<pre class=\"lang:prisma decode:true\"> local con, err = sql.conecte(host, user, senha, bd,porta,sock);\r\n  tem_erro(con,err);<\/pre>\n<p>Ap\u00f3s criar as vari\u00e1veis fazemos a conex\u00e3o;<\/p>\n<pre class=\"lang:prisma decode:true\"> local imgstr = string.base64(txt);\/\/codifica a string em base64 evitando conflitos de caracteres especiais.\r\n<\/pre>\n<p>Antes de inserirmos string da imagem lida, devemos codific\u00e1-la para n\u00e3o dar erro de caracteres. Usamos para isso a fun\u00e7\u00e3o string.base64() que recebe uma string e retorna sua codifica\u00e7\u00e3o em base 64.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">local sql_cmd = string.formate(\"INSERT INTO Filosofos(Id, Name) VALUES(10 , '%s')\", imgstr);\r\n<\/pre>\n<p>Na fun\u00e7\u00e3o acima criamos a string comando para inserir a imagem no banco de dados. Para colocar a string da imagem dentro da string de comandos MySQL usamos a fun\u00e7\u00e3o string.formate() em que o %s \u00e9 substitu\u00eddo pelo segundo par\u00e2metro. Voc\u00ea poderia facilmente, tamb\u00e9m, usar os operadores de uni\u00e3o de strings para uni-las (os &#8216;..&#8217;);<\/p>\n<pre class=\"lang:prisma decode:true\">err = con:exec(\"DROP TABLE IF EXISTS Filosofos\");\r\n<\/pre>\n<p>Apagamos a tabela caso ela exista.<\/p>\n<pre class=\"lang:prisma decode:true\">sql_crie_tab = \"CREATE TABLE Filosofos(Id INT PRIMARY KEY AUTO_INCREMENT, Name TEXT)\";\r\nerr = con:exec(sql_crie_tab);<\/pre>\n<p>Criamos a tabela Filosofos com duas colunas, a primeira &#8216;Id&#8217; como chave de auto-incremento, e a segunda &#8216;Name&#8217; tipo TEXT.<\/p>\n<pre class=\"lang:prisma decode:true\">err = con:exec(sql_cmd);<\/pre>\n<p>Enfim, inserimos o dado com a fun\u00e7\u00e3o acima, lembre-se que sql_cmd foi criada mais acima com a string da imagem.<\/p>\n<pre class=\"lang:prisma decode:true\">con:feche();\r\nretorne 0;<\/pre>\n<p>Por fim, fechamos a conex\u00e3o e retornamos 0 da fun\u00e7\u00e3o principal() para o sistema operacional.<\/p>\n<hr \/>\n<h1>9 &#8211; Lendo a imagem inserida no banco de dados<\/h1>\n<p>N\u00e3o teria sentido inserir uma imagem no banco de dados se n\u00e3o fosse poss\u00edvel obt\u00ea-la posteriormente, \u00e9 isso o que vamos fazer neste exemplo.<\/p>\n<p>Obtendo a imagem inserida conforme o exemplo anterior.<\/p>\n<p>Salve como lendo_img.prisma<\/p>\n<pre class=\"lang:prisma decode:true \">\/\/recuperando a imagem gravada com o ex_8\r\n\r\nlocal sql = inclua'mysql'\r\n\r\nfuncao principal()\r\n  \/\/conectando com o banco de dados:  \r\n  local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/apenas em servidor linux. (win nao);\r\n  local con, err = sql.conecte('localhost','usuario','senha','testedb',nulo,sock);\r\n  tem_erro(con,err,'conexao realizada');\r\n    \/\/recuperando a imagem:\r\n  err = con:exec(\"SELECT Name FROM Filosofos WHERE Id=10\");\r\n  tem_erro(con,err,'selecionado id 10 com a imagem');\r\n  \r\n  local resultado, err = con:obt_resultado();\r\n  tem_erro(con,err);\r\n \r\n  \r\n  local lin = resultado:obt_linha();\r\n  \r\n  se lin entao\r\n    local a = es.abra('img_copia.jpg','escritabin');\r\n    \/\/a:escreva(lin[1]); \/\/se usou con:escape_string(txt) no exemplo anterior use esta funcao.\r\n    a:escreva( string.dec_base64(lin[1]) );\/\/se usou a base64 entao decodifique antes de gravar.\r\n    a:feche();\r\n  fim\r\n  \r\n  resultado:feche();\r\n  con:feche();\r\n  retorne 0;\r\nfim \/\/fim principal()\r\n\r\nfuncao tem_erro(con,err,str)\r\n  se err entao \r\n    con:feche();\r\n    imprima(err);\r\n    leia();\r\n    sis.saia(1);\r\n  senao\r\n    se str entao imprima(str) fim;\r\n  fim\r\nfim<\/pre>\n<p>&nbsp;<\/p>\n<p>Detalhes:<\/p>\n<p>Vamos \u00e0 novidade<\/p>\n<pre class=\"lang:prisma decode:true\"> err = con:exec(\"SELECT Name FROM Filosofos WHERE Id=10\");<\/pre>\n<p>Aqui selecionamos a coluna Id 10 onde inserimos a imagem.<\/p>\n<p style=\"padding-left: 30px;\"><em>Obs. Poder\u00edamos criar uma tabela mais completa com campo Nome_imagem = &#8216;imagem1.jpj&#8221; ; Mas como \u00e9 um exemplo simplificado deixemos com est\u00e1.<\/em><\/p>\n<pre class=\"lang:prisma decode:true\"> local resultado, err = con:obt_resultado();<\/pre>\n<p>Obtendo o objeto resultado da execu\u00e7\u00e3o MySQL.<\/p>\n<pre class=\"lang:prisma decode:true\">local lin = resultado:obt_linha();<\/pre>\n<p>Obtendo o valor da linha selecionada.<\/p>\n<pre class=\"lang:prisma decode:true\">se lin entao\r\n    local a = es.abra('img_copia.jpg','escritabin');\r\n    \/\/a:escreva(lin[1]); \/\/se usou con:escape_string(txt) no exemplo anterior use esta funcao.\r\n    a:escreva( string.dec_base64(lin[1]) );\/\/se usou a base64 entao decodifique antes de gravar.\r\n    a:feche();\r\n  fim<\/pre>\n<p>Se lin for uma linha v\u00e1lida entao abrimos um arquivo em modo escrita bin\u00e1ria e escrevemos dentro dele o valor de lin[1]. Antes, \u00e9 claro, fazemos a decodifica\u00e7\u00e3o base64 com a fun\u00e7\u00e3o string.dec_base64(). Esta fun\u00e7\u00e3o recebe uma string em codifica\u00e7\u00e3o base64 e retorna seu valor decodificado.<\/p>\n<p>O restante \u00e9 igual aos exemplos anteriores e j\u00e1 foi explicado!<\/p>\n<hr \/>\n<h1>10 &#8211; Deletando valores da tabela do banco de dados<\/h1>\n<p>&nbsp;<\/p>\n<p>Salve como deleta.prisma<\/p>\n<pre class=\"lang:prisma decode:true \">\/\/apagando um dado de uma tabela do mysql\r\ninclua'mysql'\r\n\r\nfuncao tem_erro(con,err)\r\n  se err entao \r\n    con-&gt;.feche();\r\n    imprima(err);\r\n    sis.saia(0);\r\n    leia();\r\n  fim\r\nfim\r\n\r\n\r\nlocal xstr = \"DELETE from Carros where Id = 1;\"\/\/deleta da tabela Carros onde o Id for igual a 2;\r\n\r\n\/\/conectando com o banco de dados:  \r\n  local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/apenas em servidor linux. (win nao);\r\n  local con, err = sql.conecte('localhost','root','senha','testedb',3306,sock);\r\n  \r\nerr = con-&gt;exec(xstr);\r\n\r\ntem_erro(con,err);\r\n\r\npoe'Dado apagado com sucesso';\r\n\r\ncon-&gt;feche(); \/\/fechando a conexao\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Detalhes:<\/strong><\/p>\n<pre class=\"lang:prisma decode:true\">local xstr = \"DELETE from Carros where Id = 1;\"\/\/deleta da tabela Carros onde o Id for igual a 2;\r\n<\/pre>\n<p>Essa \u00e9 a string de comando MySQL que significa:<\/p>\n<p><strong>DELETE de Carros o valor onde id \u00e9 igual a 1;<\/strong><\/p>\n<pre class=\"lang:prisma decode:true\">err = con-&gt;exec(xstr);<\/pre>\n<p>E executamos a string ap\u00f3s abrir devidamente o banco de dados.<\/p>\n<p>N\u00e3o se esque\u00e7a de fechar os objetos no fim do programa.<\/p>\n<p>Obs.: note que n\u00e3o usamos a fun\u00e7\u00e3o principal() aqui, se quiser n\u00e3o precisa us\u00e1-la.<\/p>\n<hr \/>\n<h1>11 &#8211; Atualizando os dados de uma tabela<\/h1>\n<p>Imagine que voc\u00ea queira modificar um valor j\u00e1 existente no banco de dados, \u00e9 o que faz o exemplo abaixo:<\/p>\n<p><em>Salve como atualiza.prisma<\/em><\/p>\n<pre class=\"lang:prisma decode:true\">\/\/atualizando um dado do mysql\r\n\r\nlocal mysql = inclua'mysql';\r\n\r\nfuncao tem_erro(con,err)\r\n  se err entao \r\n    mysql.feche(con);\r\n    imprima(err);\r\n    sis.saia(0);\r\n    leia();\r\n  fim\r\nfim\r\n\r\n\r\nsql_str = \"UPDATE Carros set Nome = 'NADA_AQUI' , Preco = 0 where Id = 2;\";\r\n\r\n\/\/conectando com o banco de dados:  \r\n  local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/apenas em servidor linux. (win nao);\r\n  local con, err = mysql.conecte('localhost','root','senha','testedb',3306,sock);\r\n  \r\ntem_erro(con,err);\r\n\r\nerr = mysql.exec(con, sql_str);\r\ntem_erro(con,err);\r\n\r\npoe'Dado atualizado';\r\n\r\n\r\npoe 'imprimindo'\r\nerr = mysql.exec(con,\"SELECT * FROM Carros\");\r\nres, err = mysql.obt_res(con);\/\/a mesma funcao que mysql.obt_resultado, use qual preferir...\r\ntem_erro(con,err);\r\nlocal lin='';\r\nenquanto lin inicio\r\n  lin = mysql.obt_linha(res);\/\/obtendo a linha do resultado.\r\n  se lin entao\r\n    para i,v em ipares(lin) inicio\r\n      imprimaf(\"%s    \", v);\r\n    fim\r\n    poe'';\/\/pula uma linha na impressao.\r\n  fim\r\nfim\r\nmysql.feche_resultado(res);\r\nmysql.feche(con);\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<\/pre>\n<p><strong>Detalhes:<\/strong><\/p>\n<pre class=\"lang:prisma decode:true\">sql_str = \"UPDATE Carros set Nome = 'NADA_AQUI' , Preco = 0 where Id = 2;\";\r\n<\/pre>\n<p>Essa \u00e9 a string comando MySQL, leia da seguinte forma:<\/p>\n<p><strong>ATUALIZE Carros defina Nome = &#8216;NADA_AQUI&#8217;, Preco = 0 onde Id for igual a 2;<\/strong><\/p>\n<p>Ou seja, na linha com Id 2, as colunas Nome e Preco mudar\u00e3o de valor.<\/p>\n<pre class=\"lang:prisma decode:true\">err = mysql.exec(con, sql_str);<\/pre>\n<p>Aqui em cima, executamos o comando de atualiza\u00e7\u00e3o do bd.<\/p>\n<p>Nos comandos posteriores fazemos a leitura para ver o dado modificado, isso j\u00e1 foi explicado nos exemplos anteriores.<\/p>\n<p>Obs.: como voc\u00ea pode ter percebido, \u00e9 poss\u00edvel optar por n\u00e3o usar o estilo orientado a objeto passando explicitamente os objetos como par\u00e2metro:<\/p>\n<p><strong>mysql.exec(con,sql_str);<\/strong> ao inv\u00e9s de <strong>con:exec(sql_str);<\/strong><\/p>\n<hr \/>\n<h1>12 &#8211; Obtendo o nome das tabelas existentes em um banco de dados<\/h1>\n<p>&nbsp;<\/p>\n<p>Neste pr\u00f3ximo exemplo demonstro como descobrir automaticamente o nome das tabelas de um bd.<\/p>\n<p>Salve como nome_tab.prisma<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/imagine um banco de dado, e vc n\u00e3o sabe sequer que tabelas estao gravadas nele.\r\n\/\/com o codigo abaixo vc lista as tabelas existentes:\r\n\r\nlocal mysql=inclua'mysql'\r\n\r\n\r\nfuncao tem_erro(con,err)\r\n  se err entao \r\n    mymysql.feche(con);\r\n    imprima(err);\r\n    sis.saia(0);\r\n    leia();\r\n  fim\r\nfim\r\n\r\n\/\/conectando com o banco de dados:  \r\n  local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/apenas em servidor linux. (win nao);\r\n  local con, err = mysql.conecte('localhost','root','senha','testedb',3306,sock);\r\ntem_erro(con,err);\r\n\r\nerr = mysql.exec(con, \"SHOW TABLES\" );\r\n\r\nlocal res,err=mysql.obt_resultado(con);\r\ntem_erro(con,err);\r\n\r\npoe'Tabelas existentes:\\n\\n';\r\nlocal lin='';\r\nenquanto lin inicio\r\n  lin=mysql.obt_linha(res);\r\n  se lin entao\r\n    para i,v em pares(lin) inicio\r\n      imprimaf(\"%s   \", v);\r\n    fim\r\n    poe'';\r\n  fim\r\nfim\r\n\r\nmysql.feche_resultado(res);\r\nmysql.feche(con);\r\n\r\nleia();\r\n<\/pre>\n<p><strong>Detalhes:<\/strong><\/p>\n<p>N\u00e3o tem muito segredo, basta executar a string MySQL &#8220;SHOW TABLES&#8221; e depois pegar o resultado.<\/p>\n<pre class=\"lang:prisma decode:true\">err = mysql.exec(con, \"SHOW TABLES\" );<\/pre>\n<p>Executando a string MySQL, depois de ter aberto devidamente o banco de dados.<\/p>\n<pre class=\"lang:prisma decode:true\">local res,err=mysql.obt_resultado(con);<\/pre>\n<p>Obtendo o objeto resultado na vari\u00e1vel res.<\/p>\n<pre class=\"lang:prisma decode:true\">enquanto lin inicio\r\n  lin=mysql.obt_linha(res);\r\n  se lin entao\r\n    para i,v em pares(lin) inicio\r\n      imprimaf(\"%s   \", v);\r\n    fim\r\n    poe'';\r\n  fim\r\nfim<\/pre>\n<p>O la\u00e7o &#8216;enquanto&#8217; acima l\u00ea cada nome de tabela que houver.<\/p>\n<p>&nbsp;<\/p>\n<h1>13 &#8211; Excluindo tabelas do banco de dados<\/h1>\n<p>&nbsp;<\/p>\n<p>Salve como apaga_tab.prisma<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/deletando tabela inteira de um banco de dado mysql:\r\n\r\nlocal mysql=inclua'mysql'\r\n\r\n\r\nfuncao tem_erro(con,err)\r\n  se err entao \r\n    con:feche();\r\n    erro(err);\r\n  fim\r\nfim\r\n\r\n\/\/conectando com o banco de dados:  \r\n  local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/apenas em servidor linux. (win nao);\r\n  local con, err = mysql.conecte('localhost','root','senha','testedb',nulo,sock);\r\ntem_erro(con,err);\r\n\r\nerr = con:exec('DROP TABLE IF EXISTS Carros');\r\ntem_erro(con,err);\r\n\r\nimprima(\"Tabela Carros foi deletada\");\r\n\r\ncon:feche();\/\/fechando a conexao\r\n\r\nleia();\r\n<\/pre>\n<p><strong>Detalhes:<\/strong><\/p>\n<p>O comando para apagar a tabela \u00e9:<\/p>\n<pre class=\"lang:prisma decode:true\">err = con:exec('DROP TABLE IF EXISTS Carros');<\/pre>\n<p>&#8220;APAGUE TABELA Carros SE EXISTIR;<\/p>\n<p>Obs.: logicamente o usu\u00e1rio deve ter privil\u00e9gios para deletar a tabela.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<h1>14 &#8211; Excluindo banco de dados<\/h1>\n<p>&nbsp;<\/p>\n<p>Necess\u00e1rio privil\u00e9gios ao usu\u00e1rio.<\/p>\n<p>Salve como deleta_bd.prisma<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/deletando um banco de dados\r\nlocal mysql = inclua'mysql'\r\nfuncao tem_erro(con,err)\r\n  se err entao \r\n    mysql.feche(con);\r\n    erro(err);\r\n  fim\r\nfim\r\n\/\/conectando com o banco de dados:  \r\n  local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/apenas em servidor linux. (win nao);\r\n  local con, err = mysql.conecte('localhost','usuario','senha','testedb',3306,sock);\r\ntem_erro(con,err);\r\n\r\nerr = mysql.exec(con,\"DROP DATABASE IF EXISTS testedb;\");\r\ntem_erro(con,err);\r\n\r\npoe'Banco de dados testedb apagado com sucesso!';\r\n\r\nmysql.feche(con);\r\n\r\nleia();\r\n<\/pre>\n<p><strong>Detalhes:<\/strong><\/p>\n<pre class=\"lang:prisma decode:true\">err = mysql.exec(con,\"DROP DATABASE IF EXISTS testedb;\");<\/pre>\n<p>&#8220;APAGUE BANCO_DE_DADOS testedb SE EXISTIR&#8221;<\/p>\n<p>Exclui o banco de dados testedb.<\/p>\n<hr \/>\n<h1>15 &#8211; Limpando o Banco de Dados<\/h1>\n<p>&nbsp;<\/p>\n<p>Salve como limpa_bd.prisma<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/eliminado todas as tabelas de um banco de dados:\r\n\r\nlocal mysql=inclua'mysql'\r\n\r\nfuncao tem_erro(con,err)\r\n  se err entao \r\n    mysql.feche(con);\r\n    imprima(err);\r\n    leia();\r\n    sis.saia(1);\r\n  fim\r\nfim\r\n\/\/conectando com o banco de dados:  \r\n  local sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/apenas em servidor linux. (win nao);\r\n  local con, err = mysql.conecte('localhost','root','senha','testedb',3306,sock);\r\n\r\nerr = mysql.exec(con, \"SHOW TABLES\");\/\/basta pegar todas as tabelas existentes\r\ntem_erro(con,err);\r\n\r\nlocal res, err = mysql.obt_res(con);\r\ntem_erro(con,err);\r\nlocal lin = '';\r\nenquanto lin inicio\r\n  lin = mysql.obt_linha(res);\r\n  se lin entao\r\n    para i,v em ipares(lin) inicio\r\n      imprima(v);\r\n      err = mysql.exec(con,\"DROP TABLE IF EXISTS \" .. v );\/\/e apag\u00e1-las uma a uma aqui.\r\n      tem_erro(con,err);\r\n    fim\r\n  fim\r\nfim\r\n\r\nmysql.feche_res(res);\r\nmysql.feche(con);\r\n\r\npoe'Banco de dados foi limpo'; \/\/todas as tabelas apagadas.\r\nleia();\r\n<\/pre>\n<p><strong>Detalhes:<\/strong><\/p>\n<p>A ideia b\u00e1sica \u00e9 listar os nomes de todas as tabelas e depois apag\u00e1-las uma a uma usando um la\u00e7o.<\/p>\n<pre class=\"lang:prisma decode:true\">err = mysql.exec(con, \"SHOW TABLES\");\/<\/pre>\n<p>Aqui executamos a string que lista cada nome de tabela existente no banco de dados. Para pegar os valores devemos obter o objeto resultado:<\/p>\n<pre class=\"lang:prisma decode:true\">local res, err = mysql.obt_res(con);<\/pre>\n<p>Acima obtemos o objeto resultado na vari\u00e1vel res.<\/p>\n<pre class=\"lang:prisma decode:true\">enquanto lin inicio\r\n  lin = mysql.obt_linha(res);\r\n  se lin entao\r\n    para i,v em ipares(lin) inicio\r\n      imprima(v);\r\n      err = mysql.exec(con,\"DROP TABLE IF EXISTS \" .. v );\/\/e apag\u00e1-las uma a uma aqui.\r\n      tem_erro(con,err);\r\n    fim\r\n  fim\r\nfim<\/pre>\n<p>Com esse la\u00e7o enquanto pegamos cada linha na vari\u00e1vel lin e no la\u00e7o &#8216;para&#8217; interno pegamos os nomes de cada tabela e para cada nome executamos o comando que apaga tabelas:<\/p>\n<pre class=\"lang:prisma decode:true\"> err = mysql.exec(con,\"DROP TABLE IF EXISTS \" .. v );<\/pre>\n<p>Esse comando acima deleta as tabelas se existirem.<\/p>\n<p>Obs.: \u00e9 bom colocar o comando IF EXISTS pois se a tabela n\u00e3o existir e tentarmos apag\u00e1-la gera um erro fatal, e esse IF evita isso.<\/p>\n<hr \/>\n<h1>16 &#8211; Listando os nomes dos bancos de dados no servidor MySQL<\/h1>\n<p>Necessita privil\u00e9gios de usu\u00e1rio root<\/p>\n<p>Salve como lista_bd.prisma<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/descobrindo dos bancos de dados criados no servidor...\r\n\r\nlocal mysql=inclua'mysql'\r\n\r\nfuncao tem_erro(con,err)\r\n  se err entao \r\n    mysql.feche(con);\r\n    imprima(err);\r\n    sis.saia(0);\r\n    leia();\r\n  fim\r\nfim\r\n\r\nlocal host = 'localhost'; \r\nlocal user = 'usuario'; \r\nlocal senha = '12345';\r\nlocal porta = 3306;\r\nlocal sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\/\/apaque esta linha se seu servidor Xampp for windows.\r\n\r\nlocal con, err = mysql.conecte(host,user,senha,nulo,porta,sock);\r\ntem_erro(con,err);\r\n\r\npoe'\\nBancos criados neste servidor Mysql:\\n\\n';\r\nerr = mysql.exec(con, \"SHOW DATABASES;\");\r\ntem_erro(con,err);\r\nres,err = mysql.obt_resultado(con);\r\ntem_erro(con,err);\r\n\r\nlocal lin='';\r\nenquanto lin inicio\r\n  lin = mysql.obt_linha(res);\r\n  se lin entao\r\n    para i,v em pares(lin) inicio\r\n      imprimaf(\"%s   \", v);\r\n    fim\r\n    poe'';\r\n  fim\r\nfim\r\n\r\n\r\nmysql.feche_resultado(res);\r\nmysql.feche(con);\r\n\r\nleia();\r\n<\/pre>\n<p><strong>Detalhes:<\/strong><\/p>\n<pre class=\"lang:prisma decode:true\">err = mysql.exec(con, \"SHOW DATABASES;\");<\/pre>\n<p>String comando MySQL que lista todos os bancos de dados.<\/p>\n<pre class=\"lang:prisma decode:true\">res,err = mysql.obt_resultado(con);<\/pre>\n<p>Depois da execu\u00e7\u00e3o, obtemos o objeto resultado na vari\u00e1vel res.<\/p>\n<pre class=\"lang:prisma decode:true\">local lin='';\r\nenquanto lin inicio\r\n  lin = mysql.obt_linha(res);\r\n  se lin entao\r\n    para i,v em pares(lin) inicio\r\n      imprimaf(\"%s   \", v);\r\n    fim\r\n    poe'';\r\n  fim\r\nfim<\/pre>\n<p>Com o la\u00e7o &#8216;enquanto&#8217; percorremos todos os resultados o imprimimos os valores.<\/p>\n<hr \/>\n<h1>17 &#8211; Contando o n\u00famero de linhas de uma tabela<\/h1>\n<p>&nbsp;<\/p>\n<p>H\u00e1 uma maneira r\u00e1pida e f\u00e1cil de contar linhas de uma tabela de banco de dados MySQL.<\/p>\n<p>Salve como num_lin.prisma<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/numero de linhas inseridas em uma tabela:\r\nlocal mysql=inclua'mysql'\r\n\r\nfuncao tem_erro(con,err)\r\n  se err entao \r\n    mysql.feche(con);\r\n    imprima(err)\r\n    leia();\r\n    sis.saia(0);\r\n  fim\r\nfim\r\nsock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\r\nlocal con, err = mysql.conecte('localhost', 'usuario','senha','testedb',3306,sock);\r\ntem_erro(con,err);\r\n\r\npoe'\\nNumero de Linhas em Carros:\\n\\n';\r\nerr = con:exec( \"select count(*) from Carros;\");\r\ntem_erro(con,err);\r\nres,err = con:obt_resultado();\r\ntem_erro(con,err);\r\n\r\nlocal lin='';\r\nenquanto lin inicio\r\n  lin = res:obt_linha();\r\n  se lin entao\r\n    para i,v em pares(lin) inicio\r\n      imprimaf(\"A tabela Carros tem ::%s:: linhas de dados\\n\", v);\r\n    fim\r\n  fim\r\nfim\r\n\r\nmysql.feche_resultado(res);\r\nmysql.feche(con);\r\n\r\nleia();\r\n<\/pre>\n<p><strong>Detalhes:<\/strong><\/p>\n<pre class=\"lang:prisma decode:true\">err = con:exec( \"select count(*) from Carros;\");<\/pre>\n<p>Este comando conta o n\u00famero de linhas inseridas em Carros.<\/p>\n<p><em>Obs. Note que o comando MySQL est\u00e1 em min\u00fascula e a execu\u00e7\u00e3o ocorre sem problemas.<\/em><\/p>\n<pre class=\"lang:prisma decode:true\">local lin='';\r\nenquanto lin inicio\r\n  lin = res:obt_linha();\r\n  se lin entao\r\n    para i,v em pares(lin) inicio\r\n      imprimaf(\"A tabela Carros tem ::%s:: linhas de dados\\n\", v);\r\n    fim\r\n  fim\r\nfim<\/pre>\n<p>Com o la\u00e7o &#8216;enquanto&#8217; pegamos o valor selecionado. Nem precisar\u00edamos do la\u00e7o visto que o retorno \u00e9 um apenas com o valor n\u00famero de linhas da tabela.<\/p>\n<hr \/>\n<h1>18 &#8211; Obtendo tipo de codifica\u00e7\u00e3o de caracteres do MySQL<\/h1>\n<p>Salve como codi.prisma<\/p>\n<pre class=\"lang:prisma decode:true\"> \r\nlocal sql = inclua'mysql'\r\nlocal sock = '\/opt\/lampp\/var\/mysql\/mysql.sock';\r\nlocal con, err = sql.conecte('localhost','usuario','12345',nulo,nulo,sock);\r\nse err entao imprima(err); con:feche(); leia(); sis.saia(0); fim\r\n\r\ntab = con:obt_car_info();\r\npara c,v em pares(tab) inicio\r\n  imprima(c,':',v)\r\nfim\r\n<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">tab = con:obt_car_info();<\/pre>\n<p>Com essa fun\u00e7\u00e3o acima obtemos uma tabela com toda descri\u00e7\u00e3o da codifica\u00e7\u00e3o.<\/p>\n<pre class=\"lang:prisma decode:true\">para c,v em pares(tab) inicio\r\n  imprima(c,':',v)\r\nfim<\/pre>\n<p>E por meio comando &#8216;para&#8217; exibimos cada elemento da coluna no terminal.<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>Chegamos ao final do tutorial. Espero que ele tenha sido muito \u00fatil.<\/p>\n<p>Vou passar uns links sobre comandos MySQL como dica para quem quiser aprimorar seus conhecimentos:<\/p>\n<p><a href=\"https:\/\/www.todoespacoonline.com\/w\/2014\/10\/comandos-basicos-mysql\/\" target=\"_blank\">https:\/\/www.todoespacoonline.com\/w\/2014\/10\/comandos-basicos-mysql\/<\/a><\/p>\n<p><a href=\"http:\/\/www.univasf.edu.br\/~leonardo.campos\/Arquivos\/Disciplinas\/POO_2007_2\/Apostilando_Tutorial_MySQL.pdf\" target=\"_blank\">http:\/\/www.univasf.edu.br\/~leonardo.campos\/Arquivos\/Disciplinas\/POO_2007_2\/Apostilando_Tutorial_MySQL.pdf<\/a><\/p>\n<p>&nbsp;<\/p>\n<h3 style=\"text-align: center;\"><span style=\"color: #800000;\">FIM<\/span><\/h3>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h1><span style=\"color: #800000;\"><span style=\"color: #000000;\">Att. Adalberto<\/span><br \/>\n<\/span><\/h1>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; &nbsp; &nbsp; &nbsp; Este ser\u00e1 um how-to (guia) b\u00e1sico para demonstrar o uso do banco de dados servidor MySQL em Prisma. Pr\u00e9-requisitos: Prisma-1.0.99 ou superior. Servidor Xampp instalado e MySQL configurado. Links: Instalando Xampp no Windows: https:\/\/linguagemprisma.br4.biz\/blog\/instalando-xampp-no-windows\/ Configurando MySQL no Win.: https:\/\/linguagemprisma.br4.biz\/blog\/configurando-mysql-xampp-em-windows\/ Instalando Xampp no Linux: https:\/\/linguagemprisma.br4.biz\/blog\/instalando-servidor-xampp\/ Configurando Acesso Remoto no Linux: clique aqui&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"tpl-full-width.php","meta":{"footnotes":""},"class_list":["post-2660","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/pages\/2660","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/comments?post=2660"}],"version-history":[{"count":53,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/pages\/2660\/revisions"}],"predecessor-version":[{"id":3195,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/pages\/2660\/revisions\/3195"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=2660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}