AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 19291
Accepted
Jmoney38
Jmoney38
Asked: 2012-06-15 12:31:47 +0800 CST2012-06-15 12:31:47 +0800 CST 2012-06-15 12:31:47 +0800 CST

Passando argumentos para o psql

  • 772

Estou executando um script plpgsql no Postgres 8.3 - gostaria de passar argumentos para este script via psql. Atualmente estou executando o script como:

psql -d database -u user -f update_file.sql 

Me deparei com este link que explica a variável de ambiente PGOPTIONS, mas isso não funciona para argumentos "personalizados". ou seja, recebo um erro porque a configuração não está listada no arquivo postgres.conf.

-bash-3.2$ export PGOPTIONS='--pretend=true'
-bash-3.2$ psql -d my_db -f update_database.sql
psql: FATAL:  unrecognized configuration parameter "pretend"

Alguma outra ideia? Idealmente, eu gostaria de evitar variáveis ​​​​de ambiente ...

postgresql psql
  • 6 6 respostas
  • 40911 Views

6 respostas

  • Voted
  1. cline
    2017-05-04T16:27:27+08:002017-05-04T16:27:27+08:00

    Para adicionar outra funcionalidade para -v... Se você estiver tentando adicionar a cotação, adicione-a na linha de comando:

    psql -v action="'drop'"
    

    e isso executará o código para:

    select * where :action;
    

    O mesmo que

    select * where 'drop';
    
    • 7
  2. dezso
    2012-06-15T22:31:43+08:002012-06-15T22:31:43+08:00

    Experimente -v:

    $ psql -U postgres -v something=\'blah-blah\'
    psql (9.1.3)
    Type "help" for help.
    
    postgres=# select :something;
     ?column?
    ----------
     blah-blah
    (1 row)
    

    Se você quiser usar current_settinge SETou setval, precisará anexar uma linha a postgresql.confpara adicionar a opção.

    • 5
  3. Best Answer
    Erwin Brandstetter
    2012-06-17T19:30:28+08:002012-06-17T19:30:28+08:00

    Estritamente falando, não existe um "script plpgsql" - PL/pgSQL é a linguagem procedural padrão do PostgreSQL. É um script SQL ou uma função/procedimento plpgsql. Seu exemplo parece indicar um script SQL.

    Você pode criar uma função plpgsql (ou sql) (do lado do servidor) , que recebe qualquer número de argumentos. É muito simples, desde que os argumentos sejam values. Fica um pouco mais complicado se os argumentos incluírem identificadores. Então você terá que usar PL/pgSQL com SQL dinâmico e EXECUTE.

    O PL/pgSQL é pré-instalado por padrão no PostgreSQL 9.0 ou posterior. Você precisa instalá-lo uma vez por banco de dados no Postgres 8.3, no entanto:

    CREATE LANGUGAGE plpgsql;
    

    Falando da versão: você deve considerar atualizar para uma versão atual do PostgreSQL. v8.3 é muito antigo agora, fim de vida no início de 2013.

    Como você parece ter um script SQL pronto, demonstrarei uma função SQL. Função fictícia simples com dois argumentos inteiros:

    CREATE OR REPLACE FUNCTION func(int, int)
        LANGUAGE sql RETURNS void AS 
    $func$
        UPDATE tbl1 SET col1 = $1 WHERE id = $2;
        UPDATE tbl2 SET col1 = $1 WHERE id = $2;
    $func$;
    

    Você pode encontrar muitos exemplos mais sofisticados para plpgsql aqui no dba.SE ou no SO .

    Você pode chamar esta função e entregar parâmetros em um script de shell: Exemplo básico para uma chamada em um script de shell que usa parâmetros de entrada para parâmetros inteiros (sem aspas simples em torno do valor necessário):

    psql mydb -c "SELECT func($1, $2)"
    

    Ou com qualquer tipo de dados:

    psql mydb -c "SELECT func2('$1'::text, '$2'::numeric)"
    

    -cexecuta uma string de comando e sai. Mais sobre argumentos de linha de comando do psql no manual .

    • 5
  4. Jerry Mindek
    2014-08-19T11:47:49+08:002014-08-19T11:47:49+08:00

    Pela minha experiência, dereffing uma variável psql dentro de uma declaração plpgsql como em CREATE FUNCTION BEGIN ou DO BEGIN resulta em um erro de sintaxe:

    /tmp $ psql -U jmindek -v action=drop
    psql (9.3.4)
    Type "help" for help.
    
    jmindek=# select :'action';
     ?column? 
    ----------
     drop
    (1 row)
    
    jmindek=# DO $$ BEGIN RAISE INFO 'The value in variable action is (%)',:x; END $$;     
    ERROR:  syntax error at or near ":"
    LINE 1: ... RAISE INFO 'The value in variable action is (%)',:x; END $$...
    

    Minha solução é criar uma tabela temporária com uma única coluna e armazenar o valor nela. Esta tabela temporária é acessível via plpgsql e assim posso passar variáveis ​​do psql usadas em blocos DO.

     ~ $ psql -v action=drop
    psql (9.3.4)
    Type "help" for help.
    
    jmindek=# create temporary table actions (type text);                                                             CREATE TABLE
    jmindek=# insert into actions values (:'action');                                                                 INSERT 0 1
    jmindek=# do $$                                                                                                   declare                                                                                                            action_type text := null;                                                                                        begin                                                                                                               select type from actions into action_type;                                                                        raise info 'Hello, the action is (%)',action_type;                                                              end $$;
    INFO:  Hello, the action is (drop)
    DO
    jmindek=#
    

    Para usar variáveis ​​adicionais do psql em declarações CREATE FUNCTION ou DO, você pode criar uma coluna por variável necessária.

    • 2
  5. JohnP
    2012-06-15T22:21:33+08:002012-06-15T22:21:33+08:00

    Isso não é muito elegante, mas funciona (pseudocódigo):

    cat <<EOF
       UPDATE tablename SET field=$arg1 WHERE field = $arg2;
    EOF | psql database
    
    • 0
  6. Yordan Georgiev
    2019-09-21T23:09:16+08:002019-09-21T23:09:16+08:00

    Essa abordagem fornecerá a resolução completa em tempo de execução do env vars ... portanto, assim que seu script definir antecipadamente todas as variáveis ​​do shell abaixo, ele funcionará ( foi executado milhares de vezes em diferentes dbs e hosts ):

        -- start run.sh
    
           # 01 create / modify the app user
           sql_script="$pgsql_scripts_dir/01.create-qto-app-user.pgsql"
           PGPASSWORD="${postgres_db_useradmin_pw:-}" psql -q -t -X -w -U "${postgres_db_useradmin:-}" \
              -h $postgres_db_host -p $postgres_db_port \
              -v ON_ERROR_STOP=1 \
              -v postgres_db_user_pw="${postgres_db_user_pw:-}" \
              -v postgres_db_name="${postgres_db_name:-}" \
              -f "$sql_script" "${postgres_db_name:-}" > "$tmp_log_file" 2>&1
           ret=$?
           cat "$tmp_log_file" ; cat "$tmp_log_file" >> $log_file # show it and save it
           test $ret -ne 0 && sleep 3
           test $ret -ne 0 && doExit 1 "pid: $$ psql ret $ret - failed to run sql_script: $sql_script !!!"
        -- stop run.sh
    
        -- start fun.sql
                DO
                $do$
                BEGIN
                   IF NOT EXISTS (
                      SELECT
                      FROM   pg_catalog.pg_roles
                      WHERE  rolname = 'usrqtoapp') THEN
                         CREATE ROLE usrqtoapp WITH PASSWORD ':postgres_db_user_pw' LOGIN ;
                   END IF;
                END
                $do$;
                ALTER ROLE usrqtoapp WITH PASSWORD  :'postgres_db_user_pw' LOGIN ;
    
        -- eof run.sql
    
    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve